从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】:您无需在此处捕获self
。 observe
向您发送新值(基本上正是这个原因):
_ = theQueue.observe(\OperationQueue.operationCount, options: .new) oq, change in
print("OperationQueue.operationCount changed: \(change.newValue!)")
另外,oq
是 theQueue
,如果你需要的话。如果你需要self
,典型的做法是:
observation = observe(\.theQueue.operationCount, options: .new) object, change in
// object is `self` here.
请记住,您在此闭包内的参与者之外,因此调用可能需要在 Task 内异步。
【讨论】:
以上是关于从actor内部的operationQueue中发布`operationCount`?的主要内容,如果未能解决你的问题,请参考以下文章
Swift - 使用两个不同的OperationQueue和KVO时应用程序崩溃
在 OperationQueue 上运行 DataTask 时忽略 NSURLSession .waitsForConnectivity 标志