我正在关注"学习斯威夫特"来自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 {}内的日志没有触发,这让我觉得整个块有问题吗?帮助赞赏。
答案 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)
}
}