gpt4 book ai didi

ios - 模型间/NSManagedObject 通信

转载 作者:行者123 更新时间:2023-12-01 19:20:09 25 4
gpt4 key购买 nike

我有两个 NSManagedObject 子类:Parent 和 Child。 Parent 在 OrderedSet 中包含许多 Child(ren)。当 child 的状态发生变化时,我希望 parent 知道它。

如果我用另一种语言编程,我可能会使用事件,让父级监听来自其每个子级的事件,但是鉴于目标操作仅限于查看组件,所有 Objective C 提供给我的是使用全局 NSNotificationCenter。我绝对不喜欢模型利用全局通知的想法(在我的书中直接通过事件收听是可以的),所以看来我唯一的选择是委托(delegate)。然而,在两个 NSManagedObjects 之间使用委托(delegate)似乎是一个危险的想法,因为很难确保一方不会失去对另一方的引用。

有人对我应该如何处理这个有任何建议吗?

最佳答案

另一种选择是键值观察。像这样设置它:

const static void *kParentObservingChildSomePropertyContext = &kParentObservingChildSomePropertyContext;

[child addObserver: child.parent forKeyPath: @"someProperty" options: /*see below*/ context: kParentObservingChildSomePropertyContext];

存在奇怪的常量定义是因为每个观察上下文都应该是唯一的,这样您就不会踩到父类(super class)或子类观察上下文。要查看您需要设置哪些选项, consult the manual并与您的具体需求进行比较。现在,每当您的子对象上的该属性发生更改时,您的父级将收到:
-(void)observeValueForKeyPath: (NSString *)path ofObject: (id)object change: (NSDictionary *)change context: (void *)context;

检查您的观察是否具有正确的上下文,然后处理更改。如果您在此处获得不同的上下文,请将消息转发至 super .

完成对路径的观察后,将父级移除为子级的观察者:
[child removeObserver: child.parent forKeyPath: @"someProperty" context: kParentObservingChildSomePropertyContext];

使用与 -addObserver:forKeyPath:options:context 中相同的上下文指针以便删除观察的正确实例。

However using delegation between two NSManagedObjects seems like a dangerous idea, given the difficulty in ensuring one party does not lose its reference to the other.



委派、观察和监视来自特定对象的通知都会遇到这个问题。您需要确保您对通知感兴趣的生命周期与所涉及对象的生命周期相匹配,否则您可能很容易“泄漏”观察信息,或者 - 更糟糕的是 - 将通知发送到陈旧的对象指针。这些解决方案都不能对此免疫,尽管在委托(delegate)模式的情况下,您可以使用归零弱引用来确保当父对象消失时,子对象将不再尝试委托(delegate)给它。

关于ios - 模型间/NSManagedObject 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10773796/

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