没有调用Swift KVO changeHandler

问题描述 投票:0回答:1

我有以下代码来刷新多个项目。这一切都是异步发生的。

func refresh(_ types: [DataTypes], callback: ((String) -> Void)?) {
    let refreshOperationQueue: OperationQueue = OperationQueue()
    let operations: [Operation] = types.map({ RefreshItem.init(type: $0) })
    refreshOperationQueue.addOperations(operations, waitUntilFinished: false)
    let _: NSKeyValueObservation = refreshOperationQueue.observe(\.operationCount) { _, _ in
        if refreshOperationQueue.operationCount == 0 {
            callback?("Success")
        }
    }
}

它重新加载数据。但问题是observe changeHandler从未被称为。

我假设这是因为观察者被释放在内存中(但我可能完全错了)。如果是这种情况,我不确定如何以有效的方式解决这个问题。如果我使它更高的范围,那么它一次只能处理1次刷新,这不是最干净的解决方案。

基本上我希望callback?("Success")OperationQueue完成时运行。

我怎样才能做到这一点?

swift key-value-observing nsoperationqueue nsoperation
1个回答
1
投票

问题确实是观察者被释放在记忆中。你需要把它存放在某个地方。如果要存储任意数量的数组,只需在范围内的某个位置声明一个数组,然后将观察者添加到数组中。

或者,您可以简单地将新的BlockOperation添加到操作队列,并将所有其他操作添加为依赖项。这将导致您的完成操作在其他所有操作完成后运行。

© www.soinside.com 2019 - 2024. All rights reserved.