2

我有一个待办事项列表应用程序,它将文档作为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()
}

关于我可以做些什么来实现符合  准则的任何指针,同时仍然能够成功执行删除操作?谢谢。

4

0 回答 0