Cocoa Swift - 取消 FileManager 的任务
Cocoa Swift - Canceling a task of FileManager
我有一个重要的 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)
}
}
它似乎没有像我预期的那样工作。我做错了吗?
操作和操作队列的取消不是自动的。当您取消一个操作时,它只是设置一个标志,表明它已被取消。检查该标志并停止其自身工作取决于操作的自定义代码。
一般来说,如果没有线程中的代码 运行 的配合,停止线程(或停止线程正在做的工作)是不可行的。它会使程序状态处于损坏的配置中(例如互斥锁永久锁定)。
遗憾的是,FileManager
没有提供取消其操作的方法。您必须使用较低级别的 API 才能启用取消。 copyfile()
函数可能是最好的。这些文档不再在线,也不在 Xcode 的文档中,但您可以使用 man copyfile
命令查看它们。
我有一个重要的 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)
}
}
它似乎没有像我预期的那样工作。我做错了吗?
操作和操作队列的取消不是自动的。当您取消一个操作时,它只是设置一个标志,表明它已被取消。检查该标志并停止其自身工作取决于操作的自定义代码。
一般来说,如果没有线程中的代码 运行 的配合,停止线程(或停止线程正在做的工作)是不可行的。它会使程序状态处于损坏的配置中(例如互斥锁永久锁定)。
遗憾的是,FileManager
没有提供取消其操作的方法。您必须使用较低级别的 API 才能启用取消。 copyfile()
函数可能是最好的。这些文档不再在线,也不在 Xcode 的文档中,但您可以使用 man copyfile
命令查看它们。