swift - Cocoa Swift - 取消 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
命令查看它们。
推荐阅读
- cordova - “BackgroundGeolocation”类型上不存在属性“on”
- javascript - 如何在 onmouseover 事件上影响 previousSibling 样式。CSS 或 JavaScript
- c# - C# - 无法根据文本文件数据在列表中添加元素(这是一个列表)
- c# - 使用 .NET Core 从 MS Access 获取数据
- android - 即使在处理第二个片段之后,第一个片段也是可见的
- sql - 当另一个特定行具有某个元素时,如何使 SQL 对特定行进行计数
- lodash - 使用 Lodash 迭代匹配元素的关联数组数据
- python - 将数据序列化到 pymongo;如何处理具有属性的设置器?
- java - 与 cognito 用户池集成后如何访问 AWS API
- python - Python中的“字符串索引超出范围”错误