Tag: 键值观察

KVO在iOS 9.3中破解

这可能是iOS 9.3(发行版)中的一个可怕的错误。 当添加一个观察者到[NSUserDefaults standardUserDefaults]我已经注意到响应方法-observeValueForKeyPath:ofObject:change:context:被多次调用。 在下面的简单示例中,每次按下一次UIButton,observeValueForKeyPath就会触发两次。 在更复杂的例子中,它会激发更多次。 它只出现在iOS 9.3(在SIM卡和设备上)。 这显然会对应用程序造成严重破坏。 任何人都经历了相同的? // ViewController.m (barebones, single view app) – (void)viewDidLoad { [super viewDidLoad]; NSLog(@"viewDidLoad"); [[NSUserDefaults standardUserDefaults] addObserver:self forKeyPath:@"SomeKey" options:NSKeyValueObservingOptionNew context:NULL]; } – (IBAction)buttonPressed:(id)sender { NSLog(@"buttonPressed"); [[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"SomeKey"]; } – (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context { NSLog(@"observeValueForKeyPath: %@", keyPath); }

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

根据苹果自己的build议,当手动设置符合KVC / KVO的访问器时,应该包括两个 KVO方法willChange和didChange 。 这是我在所有手动存取器方法中所做的。 但是, observeValueForKeyPath:ofObject:change:context被调用,每个KVC方法的一半(将和做)具有完全相同的字典内容。 使用选项注册观察者时: NSKeyValueObservingOptionPrior观察者仍然被调用两次 – 每一次调用一次 – 再一次使用相同的字典内容,只保存关键字“notificationIsPrior”包含在字典中的区别。 现在,当KVO被用来改变'CPU昂贵'的属性 – 比如改变颜色或者重新绘制一个庞大而复杂的devise,只有在'didChange'的作用下忽略(或者至less分离出)'willChange ”。 在过去,我通过将密钥string转换为返回左移“1”的枚举列表元素,并使用此数字在接收到第一个调用时以32或64位整数设置标志,以及何时该标志在第二秒重置,我执行CPU密集型操作。 然而,这让我感到这是一个不小的开销,为每个案件执行。 有没有人有任何其他“偏好”的方式来区分“willChange”和“didChange”的callback,而不允许相同的处理两次? 我search了苹果公司自己的文档,这个帮助团队大量地提供替代品,但是苹果公​​司自己的文档并没有涉及到这个主题的很多细节,而且这个团队中的一些人也同样遇到了类似的担忧。 在任何情况下都没有提供明确的解决scheme。 如果有人知道更好的方法 – 除了用交替的标志来避免“willChange” – 我会非常感激。 (为什么苹果公司不能在改变词典中join“阶段”键???)

mergeChangesFromContextDidSaveNotification之后的KVO通知

我正在使用KVO观察NSManagedObject上的更改。 我正在观察的NSManagedObject是主队列上的一个NSManagedObject上下文的一部分。 当我在后台 (专用队列并发types)上下文中更新此对象,然后将保存的更改合并到我的主队列上下文(在mergeChangesFromContextDidSaveNotification中)时,KVO通知将按预期启动。 不过,我期望通知只会触发实际更改的关键path,而不是 NSManagedObject的所有关键path。 即使没有更改,我也会收到我的对象的每个键path的KVO通知。 这是由devise还是我做错了什么? 在苹果文档中看不到任何内容….

安全关键值观察关键path

我正试图在keypaths上实现一个安全的key值。 假设我有一个名为person的数据模型对象,它具有workplace属性。 workplace又有一个address属性,我希望遵守,所以我build立了关键的价值观观,以下呼吁: [person addObserver:theObserver forKeyPath:@"workplace.address" options:NSKeyValueObservingOptionNew context:NULL]; 这工作正常,直到人不换工作场所。 一旦发生这种情况: person.workplace = newWorkplace; KVC系统正确地崩溃了应用程序,说“oldAddress被释放,而关键值观察者仍然注册”。 (旧地址是以前工作地点的地址)。 不幸的是,我不能调整“人”对象类的实现来通知观察者工作场所将要消失。 有没有什么模式可以避免这种崩溃? 也许可以得到一些其他的通知? 在KVC的情况下,keypath是如何遍历的,你是否可以访问这个链?

在Swift的计算属性上的KVO

只是想知道这是否可能在斯威夫特2.2,KVO上的一个计算属性!? 即: var width = 0 var height = 0 private var area : Double { get { return with * height } } self.addOberser(self, forKeyPath: "area", …… 客户端代码是否会修改with或height触发器observeValueForKeyPath? 在参与市长课堂重构之前进行检查。 KVO的语法和讨厌的一样令人讨厌,如果有人在手边有答案的话,那就算是游乐场也是不值得的(我假设答案是NO) 问候! 〜d

读取目标设备上的UIAutomation的UIAApplication.setPreferencesValueForKey()设置?

在过去的几天里,我一直在玩苹果的UIAutomation框架,试图组装一套验收testing来推动我正在开发的应用程序(以BDDtypes的方式)。 我碰到的一件事是如何让SUT进入一个给定的状态,所以我可以开始我的testing,如果我需要设置一些内部状态发生。 问题是,苹果的Javascript环境没有提供任何function,我可以使用除了通过它的UI与设备通信(我敢肯定这可能是devise,但有时这是不切实际的):虽然像iCuke或弗兰克可以使用HTTP与embedded目标应用程序中的侦听服务器进行通信,但是在仪器的UIAutomation环境中没有办法做到这一点。 看看提供的API,我注意到在UIAApplication类中有一个函数,它允许我在目标设备上设置一个首选项值( 参见这里了解更多细节 ):在我看来,我可以在设备上安装一些代码可以使用KVO来观察给定的优先键的机会,然后我可以使用它作为与目标应用程序中的一些特定的testing特定的帮助代码进行通信的手段(当优先级的值被改变时进行反应)。 我开始四处游戏,看看是否可以做这个工作,但跑到砖墙上,我无法find一种方法来访问目标应用程序内由UIAutomation设置的首选项。 问题是首选项似乎设置在主机域级别(即它们在/Library/Preferences/com.mycompany.MyApp文件中设置),而不是在特定于我的应用程序的沙箱/Library文件夹中。 我知道肯定我设置的首选项是击中设备 – 我可以看到上述文件中的值改变,但我找不到使用NSUserDefaults访问这些值的方法。 任何人都可以阐明我应该如何访问在iOS设备上存储在这个级别(NSLocalDomain …)的偏好? 注:我意识到这是一个彻头彻尾的黑客,但不幸的是,苹果公司现在提供的环境似乎远远没有达到这个标准,所以我正在尽我所能填补空白,以代替苹果进一步的更新。 如果你在网上search,你会发现其他人有非常相似的经历,并尝试以类似的方式解决目前的缺陷。 更新 :根据这个线程有可能这是一个错误。 虽然我无法确认

将KVO属性的对象作为观察者移除的最佳做法

我想知道什么是添加和删除自己作为一些KVO财产观察员的最佳做法。 我已经将我的控制器对象添加为UIView的“隐藏”属性的观察者。 我在我的视图控制器的loadView中添加了观察者。 现在,什么是DE注册为这个属性的观察员的最佳地点。 一旦视图控制器的视图被解除,我想停止观察。 有时候,我在控制台警告下面看到,有时候我会因观察员的移动而崩溃。 有什么build议么? An instance 0x190659e0 of class UIView was deallocated while key value observers were still registered with it. Observation info was leaked, and may even become mistakenly attached to some other object. Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here's the current observation info:

如何做NSManagedObject的完美KVO?

这里完美的KVO包括两部分:正确添加观察者,正确移除观察者。 故事: 我使用一个UITableViewCell(单元格)显示一个NSManagedObject(对象)。 每个对象都有一些dynamic属性,需要通过其单元观察。 并非所有对象都具有相同的观察属性组。 我有select地添加关键path观察者: if(object.thumbnail_pic_url)[object addObserver:cell forKeyPath:@“thumbnail_picture”options:0 context:NULL]; 对象可以被删除。 当删除对象时,我必须删除观察者。 该数据库是非常大和复杂的,所以我绝对不希望注册所有单元格接收moc通知,如NSManagedObjectContextObjectsDidChangeNotification。 但是,如果必须的话,我可以接受在对象中添加一个细胞伊娃,即使它再次是好的模式 – 视图 – 控制器devise模式。 问题:如何删除对象的所有注册键path的观察者(单元格)时删除? 事实上,这是一个大问题,可以分为两个小问题: 哪里是最好的地方把观察员删除代码? 我如何确定注销哪些关键path? 删除对象后,我无法查询它的属性 – 这将导致无法填充的错误,所以我不能这样写代码: if(object.thumbnail_pic_url)[object removeObserver:cell forKeyPath:@“thumbnail_picture”]; 而且我也不能盲目移除未注册关键path的观察者 – exception(不能移除关键path“thumbnail_picture”的观察者,因为它没有注册为观察者)将被抛出。

KVO与NSNotifications

使用KVO有没有什么好处,而不是NSNotification的更“通用”(和我的opion更强大)function?

使用KVO更改属性时发送通知

我在我的课堂上有一个名为myName的属性,如: @property (nonatomic, strong) NSString *myName; 当myName属性的值改变时,我需要发送一个通知。 现在我正在做一些事情: – (void)setMyName:(NSString *)name { _myName = name; [[NSNotificationCenter defaultCenter] postNotificationName:CHANGE_NOTIFICATION object:nil]; } 我知道有一些像iOS中的键值观测 。 但是我不知道如何实现,我读了整个文档,但是不能很好的理解。 请帮助我了解如何在不使用自定义setter的情况下实现相同的function。