这会被认为是良好的编程习惯,当使用KVO

这会被认为是良好的编程习惯,当使用KVO

问题描述:

我有一个tableView(这是一个具有大约11个领域的形式),tableViewController和我正在使用的类的实例是窗体的模型。 tableView控制器使用KVO更新模型进行更新。因此,而不是11如果是比较的keyPath串在我的观察值的关键方法是这样ELSE语句 -这会被认为是良好的编程习惯,当使用KVO

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if([keypath isEqualToSTring:@"name"]){ 
     [self updateName]; 
    } 
    else if([keypath isEqualToSTring:@"age"]){ 
     [self updateAge]; 
    } 
    etc,etc,etc... 
} 

我虽然这将是清洁剂有这样的事情,只是遵循更新的命名约定方法

// KVO update methods name follow the naming convention "update<keypath>". 
// The first character of the keypath should be capitalised. 
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    NSString * firstCharacterOfKeyPath = [keyPath substringToIndex:1]; 
    NSString * capitalisedFirstCharacterOfKeyPath = [firstCharacterOfKeyPath uppercaseString]; 
    NSRange firstCharacterRange = NSMakeRange(0, 1); 
    NSString * capitalisedKeyPath = [keyPath stringByReplacingCharactersInRange:firstCharacterRange withString:capitalisedFirstCharacterOfKeyPath]; 
    NSString * updateSelectorString = [[NSString alloc] initWithFormat:@"update%@",capitalisedKeyPath]; 
    SEL updateSelector = NSSelectorFromString(updateSelectorString); 
    [self performSelector:updateSelector]; 
} 

我不确定这是否被认为是好的做法。

+1

根本没有问题 – 2013-04-11 11:32:59

我没有看到任何真正的问题在你的代码,但是我已经添加检查,如果self响应选择器,以防止进一步的崩溃:

if ([self respondsToSelector:updateSelector]) 
{ 
    [self performSelector:updateSelector]; 
} 

不过,我个人真的不喜欢KVO方法。我不想说这很糟糕,但它可能会产生不必要的错误。即你应该记得正确地移除观察者,这在UITableView的情况下可能不是微不足道的。

尽管看起来有点复杂,但我建议在这里使用委托方法,但对我来说听起来更可靠。