2011-06-17 20 views
3

因此,當類實例值發生更改時,我能夠成功地通過KVO通知通知我的另一個類,但我不知道如何在這兩個對象之間傳輸數據。我知道可以通過參數context:來做這樣的事情,但Apple's documentation未能說明如何去做。如何通過KVO通知傳輸數據?

我知道你在addObserver:forKeyPath:options:context:消息中放置了一個指向對象的指針作爲上下文參數,但是被觀察的對象是如何「看見」那個被指向的對象,以便相應地進行修改?

謝謝!

+0

需要說明的是:您希望將**更多**數據傳遞給觀察者,即不是已更改並觸發KVO通知的數據。 – 2011-06-17 06:49:10

+0

是的,確切地說。我需要傳遞更多信息。 – Stunner 2011-06-19 05:24:12

回答

0

所以我得到它的工作是這樣的...

我有一個對象(obj A)需要觀察另一個對象(obj B)和實現以下功能:observeValueForKeyPath:ofObject:change:context:

的OBJ B調用在其init函數如下:

[self addObserver:[<some singleton class> sharedManager] forKeyPath:@"someVar" options:(NSKeyValueObservingOptionNew) context:self]; 

當然,觀察者類不需要是單例類,但當然它非常方便。我傳遞了作爲上下文被觀察的對象,並允許obj A在observeValueForKeyPath:ofObject:change:context:函數中訪問obj B的所有ivars。

正如我所發現的,不同的後臺線程不用於KVO通知,所以我恢復爲使用協議傳輸信息,因爲它們都工作得相同。

這種形式的數據傳輸不被推薦,但我想指出它確實有可能。

1

上下文參數並不意味着作爲數據傳輸設備,它只是幫助觀察類區分彼此不同的觀察結果。我不確定你是否理解KVO。 KVO用於您想知道某個特定物業的更新情況。收到通知後,你通常會做一些與舊/新的屬性值:

- (void) observeValueForKeyPath: (NSString*) keyPath ofObject: (id) sender 
    change: (NSDictionary*) change context: (void*) context 
{ 
    id newValue = [change objectForKey:NSKeyValueChangeNewKey]; 
    NSLog(@"New property value: %@.", newValue); 
} 

在這種情況下,使用它並沒有多大意義,談論雙方之間的「數據傳輸」。如果除了屬性更改之外,還想獲得一些額外的數據,您可以輕鬆地將該數據作爲所觀察類的屬性公開。還是忘了志願,並引發一個普通NSNotification與作爲用戶信息傳遞的對象所需的所有數據:

NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys: 
    foo, @"foo", bar, @"bar", nil]; 
[[NSNotificationCenter defaultCenter] postNotificationName:@"Foo" 
    object:self userInfo:info]; 
+0

沒錯。事情是我使用後臺線程,並一直使用委託方法的線程對象檢索數據,並需要將此數據傳輸到另一個對象。問題在於,相同的後臺線程會遍歷其他對象中的所有委託調用。我認爲KVO通知只會通知其他對象允許另一個線程執行該功能。看起來我的假設是錯誤的,因爲相同的背景NSOperation線程仍然繼續執行觀察對象的observeValueForKeyPath:ofObject:change:context'方法。 – Stunner 2011-06-19 05:33:00

+0

如果您需要在線程之間傳遞信息,則可以使用通知方法(在'userInfo'參數中傳遞數據)與Grand Central Dispatch結合使用。您可以在主線程上'dispatch_async'通知創建代碼,保證客戶端來自後臺線程的通知將始終出現在主線程中。 – zoul 2011-06-19 05:49:16