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 命令查看它们。