gpt4 book ai didi

ios - 使用 KVO 时,这会被认为是良好的编程习惯吗

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:14:36 25 4
gpt4 key购买 nike

我有一个 tableView(它是一个包含大约 11 个字段的表单)、tableViewController 和一个我用作表单模型的类的实例。 tableView Controller 通过使用 KVO 对模型的更改进行更新。因此,与其使用 11 个 IF ELSE 语句来比较我观察值中的键路径字符串,不如这样使用键方法 -

    - (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];
}

我不确定这是否会被视为良好做法。

最佳答案

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

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

但就个人而言,我不太喜欢 KVO 方法。我不想说它不好,但它可能会产生不需要的错误。 IE。你应该记得正确地移除观察者,这在 UITableView 的情况下可能不是很简单。

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

关于ios - 使用 KVO 时,这会被认为是良好的编程习惯吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15947586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com