簡體   English   中英

基於塊的 KVO 中的選項 NSKeyValueObservingOptions.initial

[英]Option NSKeyValueObservingOptions.initial in block-based KVO

文檔說[使用.initial時]:如果還指定了 new,則通知中的更改字典將始終包含一個 newKey 條目,但永遠不會包含 oldKey 條目。

在基於塊的 KVO 觀察器中,使用oldValue接收change結構。

oldValue具有野生類型Optional<Optional<Any>>

任何 forms 的直接比較(使用 nil、.some(nil) 等)都因“任何不可比較”錯誤而失敗。

如何檢查觀察者的調用是否是初始的?

更新

出色地。

我正在觀察一個value: Any from some attribute 真正的value是由attribute內部的二進制數據構造的,並且具有傳遞它的類型,真正的類型是Bool? 在這種情況下。 觀察者被正確觸發,這不是問題。

observe(\ViewController.attribute.value, options: [.initial, .new, .old]) { (_self, change) in
    guard change.newValue as? Bool != change.oldValue as? Bool // does not work in initial
    else { 
        return 
    }
    ...
}

在最初的情況下,我有

(lldb) po change
▿ NSKeyValueObservedChange<Optional<Any>>
  - kind : __C.NSKeyValueChange
  ▿ newValue : Optional<Optional<Any>>
    ▿ some : Optional<Any>
      - some : <null>
  ▿ oldValue : Optional<Optional<Any>>
    - some : nil
  - indexes : nil
  - isPrior : false

新值為nil ( attribute.value ==.none )。 根據文檔,舊值不得包含。 我應該怎么做才能確保它不是真的被包含在內?

似乎我發現了:

guard
    case let oldValue? = change.oldValue, oldValue == nil ||
    (change.newValue as? Bool != oldValue as? Bool)
else
{
    return
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM