Vec*_*tor 6 callback key-value-observing key-value-coding ios
根据Apple自己的建议,当手动设置符合KVC/KVO标准的访问器时,应该包括BOTH KVO方法willChange和didChange.这就是我在所有手动访问器方法中所做的.
然而,observeValueForKeyPath:ofObject:change:context使用完全相同的字典内容来调用KVC方法的每一半(将要和做过).
当使用选项注册观察者时:NSKeyValueObservingOptionPrior观察者仍然被调用两次 - 每半次一次 - 并且再次使用相同的字典内容,仅保存字典中包含键'notificationIsPrior'的差异.
现在,当KVO用于改变"CPU价格昂贵"的属性时 - 比如改变颜色或重新绘制大而精细的设计,只有对'didChange'采取行动并忽略(或至少分离出)'willChange才有意义".在过去,我通过将密钥字符串转换为枚举列表元素来实现此目的,该元素返回左移'1'并使用该数字在收到第一个调用时设置32或64位整数的标志标志在第二个重置,我执行CPU密集型操作.
然而,令我感到震惊的是,对于每个案例来说,这都是一个非常重要的开销.有没有人有任何其他'首选'的方法来区分'willChange'和'didChange'的回调而不允许两次完成相同的处理?
我已经仔细搜索了Apple自己的文档和这个帮助小组的大量替代品,但Apple自己的doc实际上并没有详细介绍这个主题,而且这个小组中的一些人也有类似的问题摔跤.在任何情况下都没有提供确定的解决方案.如果有人知道更好的方式 - 除了用交替的旗帜躲避'willChange' - 我会非常感激.(为什么Apple不能在更改字典中包含'阶段'键?)
我认为这是你在评论中所得到的,但为了未来访客的利益:
如果要判断回调是"之前"还是"之后",可以在更改字典中查找NSKeyValueChangeNotificationIsPriorKey键.如果它是事先通知,则此键将等于[NSNumber numberWithBool: YES](顺便说一下字典也不包含NSKeyValueChangeNewKey的值)NSKeyValueChangeNotificationIsPriorKey的存在/值是权威的,所以如果你在不期望的时候看到它,你可能会得到双重回调.
如果您正在获得双重回调,那么它可能就像在VectorVictors案例中那样,运行时正在触发它们并且您正在触发它们.如果你打算调用will/didChangeValueForKey:手动管理你的KVO通知,(你不想要双重通知),你应该实现以下类方法:
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)theKey {
BOOL automatic = NO;
if ([theKey isEqualToString:@"propertyYourePlanningToManageYourself"]) {
automatic = NO;
} else {
automatic=[super automaticallyNotifiesObserversForKey:theKey];
}
return automatic;
}
Run Code Online (Sandbox Code Playgroud)
这在Apple的Key-Value Observing Programming Guide中有详细描述.
| 归档时间: |
|
| 查看次数: |
2359 次 |
| 最近记录: |