2016-12-06 30 views
0

正如標題所示,我正在使用KVO觀察NSManagedObject屬性。方法override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?)會觸發兩次:第一次爲屬性分配新值時,第二次當我將上下文保存在CD中時。我在設置屬性值後立即執行此操作。因爲這個,我在代碼中遇到了另一個問題,我的問題是爲什麼會發生這種情況,以及怎樣才能做到這一點(設置屬性,保存上下文並觸發一次方法)。也許我不應該立即保存上下文?KVO方法在NSManagedObject屬性上觸發兩次

+0

猜測:由於對象在更新其值時「變髒」,因此在保存時可能會通過將更改保存到存儲區並使用db中的內容刷新實例上的所有屬性來清理所有屬性。 –

回答

0

我相信我上面的評論(直覺)其實是正確的。它似乎沒有記錄,但在mergeChangesFromContextDidSaveNotification(即,當MOC保存時)觸發所有屬性的刷新的所有平臺上觀察到。 CF:KVO notifications after mergeChangesFromContextDidSaveNotification

對於如何處理的行爲的建議:志願代碼,一般來說,應該是冪等,速度快,恰恰是因爲它可以被調用的時候,當的keyPath設置即。

+0

我現在看到了,這是正確的。感謝您的幫助!我會將此標記爲正確答案。我已經將保存到代碼的其他部分,我已經將該對象作爲屬性的觀察者移除,因此它將啓動一次! – sheinix