swift中的完成关闭似乎没有被解雇

时间:2016-05-14 06:26:01

标签: ios swift

我正在关注"学习斯威夫特"来自O&#re;的书,我有一些看起来像的代码:

func deleteDocumentAtURL(url: NSURL) {
    NSLog("Got to top of deleteDocumentAtURL, url: \(url)")
    let fileCoordinator = NSFileCoordinator(filePresenter: nil)
    fileCoordinator.coordinateWritingItemAtURL(url, options: .ForDeleting, error: nil, byAccessor: { (urlForModifying) -> Void in
        NSLog("Here I am")
        do {
            NSLog("Got inside deleteDocumentBlock")
            try NSFileManager.defaultManager().removeItemAtURL(urlForModifying)

            // Remove the URL from the list
            self.availableFiles = self.availableFiles.filter {
                $0 != url
            }

            // Update the collection
            self.collectionView?.reloadData()

        } catch let error as NSError {
            let alert = UIAlertController(title: "Error deleting", message: error.localizedDescription, preferredStyle: UIAlertControllerStyle.Alert)

            alert.addAction(UIAlertAction(title: "Done", style: .Default, handler: nil))

            self.presentViewController(alert, animated: true, completion: nil)
        }
    })
}

当我运行此代码(通过单击界面中的按钮触发)时,应用程序将挂起。此外,do {}内的日志没有触发,这让我觉得整个块有问题吗?帮助赞赏。

2 个答案:

答案 0 :(得分:0)

由于

let fileCoordinator = NSFileCoordinator(filePresenter: nil)

在函数中是本地的。如果您完成了该功能,则该变量已被销毁。 因此,无法执行异步块。

fileCoordinator 作为实例变量添加到类中。

答案 1 :(得分:0)

您没有处理错误,可能有错误

Documentation for coordinateReadingItemAtURL

  

outError:输入时,指向错误对象指针的指针。如果文件演示者在准备此读取操作时遇到错误,

此参数中将返回错误,并且不会执行reader参数中的块。< / strong>

如果在执行读取器块之前取消此操作,则此参数在输出时包含错误对象。

添加错误处理程序并查看是否收到错误

func deleteDocumentAtURL(url: NSURL) {
    NSLog("Got to top of deleteDocumentAtURL, url: \(url)")
    let fileCoordinator = NSFileCoordinator(filePresenter: nil)
    var error: NSError?
    fileCoordinator.coordinateWritingItemAtURL(url, options: .ForDeleting, error: &error, byAccessor: { (urlForModifying) -> Void in
        NSLog("Here I am")
        do {
            NSLog("Got inside deleteDocumentBlock")
            try NSFileManager.defaultManager().removeItemAtURL(urlForModifying)

            // Remove the URL from the list
            self.availableFiles = self.availableFiles.filter {
                $0 != url
            }

            // Update the collection
            self.collectionView?.reloadData()

        } catch let error as NSError {
            let alert = UIAlertController(title: "Error deleting", message: error.localizedDescription, preferredStyle: UIAlertControllerStyle.Alert)

            alert.addAction(UIAlertAction(title: "Done", style: .Default, handler: nil))

            self.presentViewController(alert, animated: true, completion: nil)
        }

    })
    //Error:
    if(error != nil){
        print(error)
    }
}