问题描述
我有一个使用Operation
子类和OperationQueue
实现的现有流程。我正在尝试将合并作为学习练习重新实现。
简化后的当前版本如下:
func testFunction(completionHandler: (Result) -> Void) {
let op = LongRunningOperation(object: self.stateObject)
op.completionHandler = { [unowned op] in
let result = op.result
self.stateObject.update(with: result)
completionHandler(result)
}
localSerialQueue.addOperation(op)
}
一些重要方面。 LongRunningOperation
是异步的。根据{{1}},可能需要调出主队列以完成登录过程。仅在stateObject
上访问stateObject
。另外,为了明确起见,还可能有对localSerialQueue
的其他并发调用,因此由队列+操作提供的序列化是必不可少的。
可变状态和潜在的并发调用的组合对于该问题绝对至关重要。
为了说明这个问题,我制作了一个示例,证明,该合并管道不是原子执行的。任何其他结果都会令我感到惊讶,但我只是想验证一下。多个线程可以同时执行管道的各个阶段,这违反了我们的前提条件检查。
runOperation
非常清楚,我的问题不是关于如何建立一个合并管道。它涉及Combine同步原语的语义,以及如何保护管道中访问的可变状态。而且,可能的解决方案是将Combine与另一种形式的同步(如锁)结合使用来处理这种访问模式。没关系!我只是好奇是否其他人遇到了这种问题,是否有更惯用的方式,或者我是否可以以某种方式重新构造问题。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)