簡體   English   中英

KVO和重構

[英]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.

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