這里應當注意到通過KVC訪問特性(attribute)或屬性(properties)將會觸發KVO通知,當產生改變的時候.在某些情況下我們不希望它產生或希望它遲點產生.
此時,我們可以通過-primitiveValueForKey和-setPrimitiveValueForKey方法來訪問.這兩個方法和-valueForKey和-setVAlue:forKey是相同的,但是它們其實不觸發KVO通知.這意味著余下的代碼將不會心識到任何我們做的改變除非我們顯示通知它們.
這在我們從外部源1次性加載具有多個屬性的數據時尤其有用.想象1下:偶們寫了個1個菜單數據導入器接收1個其他利用的CSV文件,在這類情況下,我們可能不希望UI或我們App中的其他部份在導入進行到1半時做甚么決定.因此我們想要更新數據但不立即觸發通知,就像下面的代碼1樣:
func importData(values: [String:AnyObject]) { willChangeValueForKey("name") willChangeValueForKey("desc")
willChangeValueForKey("serves") willChangeValueForKey("type") setPrimitiveValue(values["name"], forKey:"name") setPrimitiveValue(values["desc"], forKey:"desc") setPrimitiveValue(values["serves"], forKey:"serves") setPrimitiveValue(values["type"], forKey:"type") didChangeValueForKey("name") didChangeValueForKey("desc") didChangeValueForKey("serves") didChangeValueForKey("type")
}
在這個例子中,我們自己觸發改變通知并且使用-setPrimitiveValue:forKey方法設置值直接設置我們的NSManagedObject.這將致使所有的值在通知觸發之前被更新終了!