没有调用Swift KVO changeHandler

时间:2017-12-13 04:41:57

标签: swift key-value-observing nsoperationqueue nsoperation

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

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完成时运行。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

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

或者,您可以简单地将新的function bouncer(arr) { return arr.filter(Boolean); } console.log(bouncer([7, "ate", "", false, 9, 0, NaN, null, undefined]));添加到操作队列,并将所有其他操作添加为依赖项。这将导致您的完成操作在其他所有操作完成后运行。