如何掌握当前正在执行的NSOperation?

Jon*_*sen 11 cocoa multithreading objective-c nsoperation

是否有相当于[NSOperationQueue currentQueue][NSThread currentThread]NSOperation

我有一个相当复杂的域模型,其中繁重的处理发生在调用堆栈中.为了及时取消操作,我需要将NSOperation参数作为参数传递给每个方法,直到我想要中断更长时间运行的循环.使用我可以使用的线程,[[NSThread currentThread] isCancelled]如果有一个NSOperation的等价物似乎很方便,不幸的是只有看似无用的东西[NSOperationQueue currentQueue].

Ars*_*nik 7

想出了swift中的扩展,它返回了正在运行的操作

extension NSOperationQueue {
    public var runningOperations: [NSOperation] {
        return operations.filter {$0.executing && !$0.finished && !$0.cancelled}
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以拿起第一个

if let operation = aQueue.runningOperations.first {}
Run Code Online (Sandbox Code Playgroud)


Jos*_*zzi 3

这不是一个好主意。操作通常被它们的队列取消。在操作的 main() 方法中,您可以定期检查 self 是否被取消(例如,每 n 次循环一次,或在每个主要命令块的开始处),如果是则中止。

为了响应取消(例如,某些与操作或队列状态相关的 UI 元素),您可以使用键值观察 (KVO) 让控制器观察操作的启动、完成和取消属性(根据需要),然后设置当这些键更新时你的 UI 状态(始终在主线程上)。根据 JeremyP 的评论,重要的是要注意 KVO 通知来自操作线程,并且 UI 应该(几乎)始终在主线程上进行操作上进行操作,因此当您接收有关您的操作的状态更改 KVO 注释。

你到底想做什么?也就是说,为什么您觉得应用程序的其他部分需要直接了解当前操作?

  • 呃……你在投反对票之前读过我的帖子吗?观察这些属性“正是”这些事情是如何完成的。您观察状态更改,然后使用 -performSelectorOnMainThread... 执行需要在主线程上执行的任何操作。“这一切都行不通”对我来说是个新闻,因为我有几个应用程序就是这样做的。另外,我从来没有说过你“设置”了取消。事实上,我特别说过队列取消操作,操作会定期检查此状态,如果为真则停止工作。 (3认同)