[英]KVO and refactoring
讓我們說我有:
@property NSNumber* number;
我的控制器正在觀察:
- (void)observeValueForKeyPath:(NSString *)keyPath ...
{
if ([keyPath isEqualToString:@"number"]) ...
}
我的問題是 - 你重構number
屬性名稱的方法是什么 ?
很明顯,我需要在觀察者代碼中更新觀察到的密鑰,但是我怎么能以某種智能/自動的方式進行,並且不會錯過任何觀察者來處理我的財產變更?
一種方法是為所有正在觀察的屬性聲明字符串常量。 使用這些常量來添加觀察者和比較keypath
。 每當要重命名屬性時,都應更改這些字符串常量的值。
我不認為完全霧化是可能的。
好的,我會回復自己:)我的解決方案是Apurv解決方案和單元測試的混合。
這里是:
1對於MyClass
每個觀察屬性,定義:
static NSString* MyClassPropertyNameNumber = @"number";
2 In - (void)observeValueForKeyPath:(NSString *)keyPath ...
實現僅使用定義的NSStrings。
- (void)observeValueForKeyPath:(NSString *)keyPath ...
{
if ([keyPath isEqualToString:MyClassPropertyNameNumber]) ...
}
3編寫單元測試,檢查MyClass對象是否響應setNumber:
和number
選擇器。
- (void)testMyClass
{
SEL numberGetter = NSSelectorFromString(MyClassPropertyNameNumber);
SEL numberSetter = NSSelectorFromString([NSString stringWithFormat:@"set%@:", MyClassPropertyNameNumber]);
MyClass* testMyClass = [[MyClass alloc] init];
if (![testMyClass respondsToSelector:numberGetter] || ![testMyClass respondsToSelector:numberSetter])
{
STFail(@"%@: %@ property name has changed! Please update your defined property name!", NSStringFromClass([MyClass class]), MyClassPropertyNameNumber);
}
}
如果您更改屬性名稱,它將失敗,並且不更新已定義的屬性名稱。
我希望它會對某人有所幫助:)
為每個觀察到的鍵路徑定義一個變量,在注冊時和觀察者處理程序方法中將它們用作上下文:
static void * numberKVO = &numberKVO;
static void * letterKVO = &letterKVO;
...
[self addObserver:self
forKeyPath:@"kp.4.number"
options:NSKeyValueObservingOptionNew
context:numberKVO];
[self addObserver:self
forKeyPath:@"kp.4.letter"
options:NSKeyValueObservingOptionNew
context:letterKVO];
...
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if (context == numberKVO) {
...
} else if (context == letterKVO) {
...
}
}
您可以修改屬性和鍵路徑,而無需更改任何其他內容。
在處理Core Data模型類時, Mogenerator是一個很好的工具。 它為以下所有屬性,關系和獲取的屬性生成NSStrings:
extern const struct ModelClassAttributes
extern const struct ModelClassRelationships
extern const struct ModelClassFetchedProperties
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.