2010-09-27 82 views
0

很多時候我遇到的情景時,我想觀察一個保留的性質變化:有沒有一種很好的方式來設置保留屬性的KVO?

@interface AnObserver {…} 
@property(retain) Foo *foo; 

現在,當我想設置的觀察,我需要寫我自己的二傳手,重複所有的樣板二傳手碼:

- (void) setFoo: (Foo*) newFoo { 
    if (newFoo == foo) 
     return; 
    [foo removeObserver:self forKeyPath:…]; 
    [foo release], foo = [newFoo retain]; 
    [foo addObserver:self forKeyPath:…]; 
} 

這是愚蠢的,因爲它污染了樣板代碼的來源,很容易漏掉一些東西。有沒有更好的方式來設置保留屬性的KVO?我希望我可以寫下類似Mooseafter掛鉤來更改屬性更改後的KVO。

事實上,我意識到我可以看物業本身:

[self addObserver:self forKeyPath:@"foo"…]; 

,然後更改志願時的財產變化:-),但我不知道這是要比手寫的制定者更復雜我想避免。

想法?

回答

2

如何使用關鍵路徑?假設您想要觀察foovalue1value2屬性的更改。您可以使用:

[self addObserver:self forKeyPath:@"foo.value1"]; 
[self addObserver:self forKeyPath:@"foo.value2"]; 

然後當這些屬性發生變化時,您將收到通知。

+0

這似乎工作,謝謝! – zoul 2010-09-28 05:39:53

相關問題