可可Swift-取消FileManager的任务

时间:2018-07-04 22:42:56

标签: swift macos cocoa nsoperationqueue

我拥有大量的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)
    }
}

它似乎没有按我预期的那样工作。我做错了吗?

1 个答案:

答案 0 :(得分:0)

取消操作和操作队列不是自动的。取消操作时,它仅设置一个标志,指示已被取消。由该操作的自定义代码检查该标志并停止其工作。

通常,如果没有在该线程中运行的代码的配合,停止一个线程(或停止该线程正在执行的工作)实际上是不可行的。它将使程序状态保持为损坏的配置(例如,互斥锁被永久锁定)。

不幸的是,FileManager没有提供取消其操作的方法。您必须使用较低级别的API才能启用取消功能。 copyfile()函数可能是最好的。这些文档不再在线,也不在Xcode的文档中,但是您可以使用man copyfile命令来查看它们。