我有一个待办事项列表应用程序,它将文档作为UIDocument
对象存储在 iCloud 中。创建表视图控制器中的以下函数以在 iCloud 中本地和远程删除待办事项列表项,但在通过滑动执行时挂起应用程序以删除表视图单元格上的手势:
fileprivate func deleteNote(at indexPath: IndexPath) {
let noteDocument = self.noteDocuments[indexPath.row]
let fileCoordinator = NSFileCoordinator(filePresenter: nil)
fileCoordinator.coordinate(writingItemAt: noteDocument.fileURL,
options: NSFileCoordinator.WritingOptions.forDeleting,
error: nil) { [weak self] (passedURL: URL) in
guard let weakSelf = self else { return }
do {
try FileManager.default.removeItem(at: passedURL)
weakSelf.noteDocuments.remove(at: indexPath.row)
weakSelf.tableView.deleteRows(at: [indexPath], with: .bottom)
weakSelf.tableView.reloadData()
}
catch let error as NSError {
print("Error occured deleting a document. Reason: \(error.localizedDescription)")
}
}
}
iOS 文档的基于文档的编程指南在删除文档部分中指出,删除 iCloud 中的项目应在后台线程中异步执行。所以我封装了NSFileCoordinator
带有 GCD 的实例化,但每次执行删除操作后,它都会短暂消失然后重新出现(我可以在 iCloud Drive 中看到这种情况)。所以,基本上,它不会被删除。
fileprivate func deleteNote(at indexPath: IndexPath) {
let noteDocument = self.noteDocuments[indexPath.row]
DispatchQueue.global(qos: .default).async {
let fileCoordinator = NSFileCoordinator(filePresenter: nil)
fileCoordinator.coordinate(writingItemAt: noteDocument.fileURL,
options: NSFileCoordinator.WritingOptions.forDeleting,
error: nil) { (passedURL: URL) in
do {
try FileManager.default.removeItem(at: passedURL)
}
catch let error as NSError {
print("Error occured deleting a document. Reason: \(error.localizedDescription)")
}
}
}
self.noteDocuments.remove(at: indexPath.row)
self.tableView.deleteRows(at: [indexPath], with: .fade)
self.tableView.reloadData()
}
我可以成功删除它的唯一方法实际上是不遵循指南。我不使用也不像这样 NSFileCoordinator
coordinate(writingItemAt:options:error:byAccessor:)
在后台线程中异步设置删除操作DispatchQueue
global(qos:)
fileprivate func deleteNote(at indexPath: IndexPath) {
let noteDocument = self.noteDocuments[indexPath.row]
do {
try FileManager.default.removeItem(at: noteDocument.fileURL)
}
catch let error as NSError {
print("Error occurred deleting a document. Reason: \(error.localizedDescription)")
}
self.noteDocuments.remove(at: indexPath.row)
self.tableView.deleteRows(at: [indexPath], with: .fade)
self.tableView.reloadData()
}
关于我可以做些什么来实现符合 准则的任何指针,同时仍然能够成功执行删除操作?谢谢。