簡體   English   中英

關鍵值觀察級聯

[英]Key Value Observing Cascading

更改通知是否隨KVO降級到其屬性,還是有任何優雅的方法不包括通過簡單地觀察父級和子級更改來手動實現?

假設我們有一個User類和一個Document類。 一個用戶可以擁有任意數量的文檔。 現在,假設我有一個顯示有關文檔詳細信息的視圖控制器,還假設我在某個地方存儲了一個名為currentUser的變量。 如果現在我觀察到屬於該用戶的一個文檔對象,該對象也是currentUser的值,並且我將currentUser更改為另一用戶,則更改通知將“級聯”下降到僅觀察該文檔對象的那個視圖控制器屬於先前的“ currentUser”?

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

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

但是,在KVO中,有可能觸發受另一個屬性更改影響的屬性的更改通知 這通常用於計算屬性:

想象一下一個類Event ,它具有讀/寫屬性startDateendDate ,以及一個計算的屬性duration ,該屬性根據開始日期和結束日期來計算持續時間:

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

您將設置此類,以便在有人修改startDateendDate時將duration通知觀察者:

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

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

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

    }

    return keyPaths;
}

鍵值觀察編程指南中對此有更詳細的描述。

暫無
暫無

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

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