【问题标题】:Swift KVO changeHandler not being calledSwift KVO changeHandler 未被调用
【发布时间】:2017-12-13 04:41:56
【问题描述】:

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

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】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多