ios – 区分willChangeValueForKey和didChangeValueForKey的KVO都是必要的吗?

ios – 区分willChangeValueForKey和didChangeValueForKey的KVO都是必要的吗?,第1张

概述根据Apple自己的建议,当手动设置符合KVC / KVO标准的访问器时,应该包括两个KVO方法willChange和didChange.这就是我在所有手动访问器方法中所做的. 但是,observeValueForKeyPath:ofObject:change:上下文被调用每个KVC方法的一半(将要和做过)与完全相同的字典内容. 当使用选项注册观察者时:NSKeyValueObservingOpt 根据Apple自己的建议,当手动设置符合KVC / KVO标准的访问器时,应该包括两个KVO方法willChange和dIDChange.这就是我在所有手动访问器方法中所做的.

但是,observeValueForKeyPath:ofObject:change:上下文被调用每个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;}

这在Apple的Key-Value Observing Programming Guide.中有详细描述

总结

以上是内存溢出为你收集整理的ios – 区分willChangeValueForKey和didChangeValueForKey的KVO都是必要的吗?全部内容,希望文章能够帮你解决ios – 区分willChangeValueForKey和didChangeValueForKey的KVO都是必要的吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1068392.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-26
下一篇2022-05-26

发表评论

登录后才能评论

评论列表(0条)

    保存