2013-01-16 52 views
5

比方说,我有:志愿和重构

@property NSNumber* number; 

我的控制器观察:

- (void)observeValueForKeyPath:(NSString *)keyPath ... 
{ 
    if ([keyPath isEqualToString:@"number"]) ... 
} 

我的问题是 - 什么你的方法来重构number财产的名字吗?

很明显,我需要在观察者代码中更新观察关键点,但是我怎样才能以某种智能/自动方式来做到这一点,并且不要错过任何观察者来处理我的财产变化?

+0

你想重构什么?我甚至没有看到实际的代码能够做些什么。 – 2013-01-16 12:27:23

+0

对不起,我刚刚更新我的意思是重命名属性和更新观察keyPath名称 –

回答

3

一种方法是为所有正在观察的属性声明字符串常量。使用这些常量添加观察者并比较keypath。无论何时要重命名属性,都应该更改这些字符串常量的值。

我不认为完全雾化是可能的。

+0

是的,我在想它,它仍然要求;) –

+0

另一种方法是使用反射。如果确定您的类中的属性数量和顺序不会改变,那么可以使用运行时函数的帮助,例如访问特定索引的属性。 – Apurv

3

好的,我会回应自己:)我的解决方案是Apurv解决方案和单元测试的混合。

这:

对于MyClass每个观测到的属性来定义:

static NSString* MyClassPropertyNameNumber = @"number";

- (void)observeValueForKeyPath:(NSString *)keyPath ...实施使用定义NSString的。

- (void)observeValueForKeyPath:(NSString *)keyPath ... 
{ 
    if ([keyPath isEqualToString:MyClassPropertyNameNumber]) ... 
} 

写单元测试如果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); 
    } 
} 

如果您要更改属性名称,并且不更新定义的属性名称,它将失败。

我希望这将是有帮助的人:)

1

定义每个键观察路径的变量,把它们作为背景注册时和在观察者处理方法:

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) { 
     ... 
    } 
} 

您可以修改属性和关键路径而不改变其他任何东西。

0

Mogenerator是处理核心数据模型类的好工具。它为所有属性,关系和提取属性生成NSString:

extern const struct ModelClassAttributes 
extern const struct ModelClassRelationships 
extern const struct ModelClassFetchedProperties