首页 > 解决方案 > 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)
    }
}

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

标签: swiftmacoscocoansoperationqueue

解决方案


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

一般来说,如果没有在该线程中运行的代码的合作,停止一个线程(或停止该线程正在执行的工作)是不可行的。它将使程序状态处于损坏的配置中(例如,互斥锁永久锁定)。

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


推荐阅读