从actor内部的operationQueue中发布`operationCount`?

Posted

技术标签:

【中文标题】从actor内部的operationQueue中发布`operationCount`?【英文标题】:Publish `operationCount` from operationQueue inside actor? 【发布时间】:2021-11-21 18:46:51 【问题描述】:

我有一个演员:

actor MyActor 
    
    let theQueue = OperationQueue()

    init() 

        _ = theQueue.observe(\OperationQueue.operationCount, options: .new)  oq, change in
            print("OperationQueue.operationCount changed: \(self.theQueue.operationCount)")
        
        
    

    ....


我试图让 KVO 触发某种类型的发布者调用,应用中的其他模型可以订阅并在 operationCount 更改时根据需要做出反应。

我本来打算有一个可能会设置它的函数,但是到目前为止,在该初始化程序中使用 self 会给我这个警告,根据这个:

https://forums.swift.org/t/proposal-actor-initializers-and-deinitializers/52322

很快就会变成错误。

我得到的警告是这样的:

Actor 'self' 只能被异步初始化器的闭包捕获

那么,我如何触发发布者,然后其他模型可以对此做出反应,从而在操作队列的operationCount 发生变化时发布它?

【问题讨论】:

请不要在问题中添加答案。这个问题应该是一个问题。如果您有其他答案,请将其作为答案 我认为其他人知道它会很有用,因为标题上写着“发布”,这是一个与我最终使用的组合方法相关的关键字。鉴于 Rob Napier 的回答在上下文中似乎是可以接受的,我不想发布一个会收缩他的答案。如果我偶然发现了这个问题,我会希望有这个补充。但那只是我的个人意见。谢谢。 可以很好发布替代答案。它与现有/接受的答案并不矛盾。这就是 Stack Overflow 的工作原理:它收集单个问题的多个答案。您应该将您的答案作为答案提供,以便它有用。 【参考方案1】:

您无需在此处捕获selfobserve 向您发送新值(基本上正是这个原因):

_ = theQueue.observe(\OperationQueue.operationCount, options: .new)  oq, change in
    print("OperationQueue.operationCount changed: \(change.newValue!)")

另外,oqtheQueue,如果你需要的话。如果你需要self,典型的做法是:

observation = observe(\.theQueue.operationCount, options: .new)  object, change in
    // object is `self` here.

请记住,您在此闭包内的参与者之外,因此调用可能需要在 Task 内异步。

【讨论】:

以上是关于从actor内部的operationQueue中发布`operationCount`?的主要内容,如果未能解决你的问题,请参考以下文章

FlinkFLink 通讯组件 Akka与Actor 模型

Swift - 使用两个不同的OperationQueue和KVO时应用程序崩溃

在 OperationQueue 上运行 DataTask 时忽略 NSURLSession .waitsForConnectivity 标志

Erlang VS Akka- Actor模型介绍

Swift - 使用两个不同的 OperationQueue 和 KVO 时应用程序崩溃

为啥在 s-s-rS 2008 中出现“报告处理中发生意外错误”?