2011-06-21 70 views
2

是否將通知與KVO級聯到其屬性,或者是否有任何優雅的方式不包括通過簡單地觀察父級和子級更改手動實現?Key Value Observing Cascading

我們假設我們有一個User類和一個Document類。一個用戶可以擁有任意數量的文檔。現在讓我們假設我有一個視圖控制器來顯示關於文檔的細節,並讓我們假設我在某處存儲了一個名爲currentUser的變量。如果我現在觀察屬於同一個用戶的一個文檔對象,該用戶同時也是currentUser的值,並且我將當前用戶更改爲另一個用戶,那麼更改通知是否會級聯到僅監視文檔對象的那個視圖控制器屬於之前的「當前用戶」?

+0

當你嘗試過時發生了什麼? –

+0

正如在下面的答案中所說的,你必須做更多的事情才能通知「受影響」的屬性觀察者。 – Raphael

回答

5

觀察者僅接收關於它實際觀察的(特定)對象的(特定)屬性的通知。它不會收到有關任何其他更改的通知。

如果我正確理解了你的描述,觀察者正在觀察一個特定文檔對象的屬性。觀察者沒有觀察currentUser屬性(它是另一個對象的一部分)。所以不行,如果currentUser更改,觀察者肯定不會收到通知。

然而,KVO可能會通過觸發受其他屬性更改影響的屬性的更改通知。這通常用於計算屬性:

設想一個類Event,其具有讀/寫屬性startDateendDate,並計算基於開始和結束日期的持續時間的計算屬性duration

- (NSTimeInterval)duration 
{ 
    return [[self endDate] timeIntervalSinceDate:[self startDate]]; 
} 

你會設立這個類,以便它通知duration觀察家當有人修改startDateendDate

+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key 
{ 
    NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key]; 

    if ([key isEqualToString:@"duration"]) { 

     keyPaths = [keyPaths setByAddingObjectsFromSet: 
      [NSSet setWithObjects:@"startDate", @"endDate", nil] 
     ]; 

    } 

    return keyPaths; 
} 

這在Key-Value Observing Programming Guide中有更詳細的描述。

相關問題