我拥有大量的FileManager功能。它将文件从A复制到B。我想创建一个按钮来取消该操作。所以我写了这个:
@IBAction func onClickCancelBtn(_ sender: NSButton) {
print(oq.isSuspended)
oq.cancelAllOperations()
}
//MARK: - Sync Button
var oq = OperationQueue()
@IBAction func onClickSyncBtn(_ sender: NSButton) {
ProgressBar.doubleValue = 0
ProgressInfo.isHidden = false
CancelBtn.isHidden = false
oq.addOperation {
self.OneWayBackUp(thePlaylists: selected_playlists)
}
}
它似乎没有按我预期的那样工作。我做错了吗?
答案 0 :(得分:0)
取消操作和操作队列不是自动的。取消操作时,它仅设置一个标志,指示已被取消。由该操作的自定义代码检查该标志并停止其工作。
通常,如果没有在该线程中运行的代码的配合,停止一个线程(或停止该线程正在执行的工作)实际上是不可行的。它将使程序状态保持为损坏的配置(例如,互斥锁被永久锁定)。
不幸的是,FileManager
没有提供取消其操作的方法。您必须使用较低级别的API才能启用取消功能。 copyfile()
函数可能是最好的。这些文档不再在线,也不在Xcode的文档中,但是您可以使用man copyfile
命令来查看它们。