2014-01-20 103 views
1

考慮具有兩個屬性的核心數據實體:text和 - 爲了簡單起見,textLengthtextLength是每次更改text時計算出的屬性。我有三個要求:核心數據中的計算屬性

  1. 更新textLength每次text變化,理想的NSManagedObject子裏面。
  2. textLength由於性能原因無法根據需求進行計算(我使用的實際計算的屬性計算起來要貴得多)。
  3. 每次更新text時更新UI。

我的解決方案几乎就在那裏。我提供一個自定義的訪問爲setText:,像這樣:

- (void)setText:(NSString *)text 
{ 
    static NSString *key; 
    if (!key) key = NSStringFromSelector(@selector(text)); 
    [self willChangeValueForKey:key]; 
    [self setPrimitiveText:text]; 
    self.textCount = text.count; 
    [self didChangeValueForKey:key]; 
} 

並在UI採用國際志願者組織觀察員文本的變化:

[someObject addObserver:self forKeyPath:NSStringFromSelector(@selector(text)) options:NSKeyValueObservingOptionNew context:someContext]; 

這工作正常,在大多數情況下,當我執行撤消除。我直接將Core Data調用setPrimiteValue:forKey:,這不會觸發我的計算邏輯。因此,當UI被通知更改時,textLength值已過時。

按需計算textLength的缺點,計算邏輯應該在哪裏?

回答

1

這是- (void)awakeFromSnapshotEvents:(NSSnapshotEventType)flags方法的用途。它會告訴您快照更改的原因,並允許您更新計算/派生數據。

(當您更新派生值時,應使用適當的原始方法設置它)

+0

+1 Nice!所以你會建議把計算邏輯放在兩個地方(自定義存取器和'awakeFromSnapshotEvents:')? – hpique

+0

從這兩個地方觸發,但計算應採用不同的方法... – Wain

+0

我剛剛嘗試過這一點,它似乎'awakeFromSnapshotEvents:'在KVO通知被觸發後調用,所以它也不能解決問題。那麼,我想我也可以觀察'textLength',但保持簡單會更好。 – hpique