【问题标题】:KVO, properties changes and notificationsKVO、属性更改和通知
【发布时间】:2014-06-18 07:21:29
【问题描述】:

我有一个共享单例,其中包含有关当前用户及其会话的所有相关信息,通过对象 [IWSession session][IWSession session].currentUser

当前用户(实际上是指登录应用程序的用户)可能通过 web 服务调用(由 iBeacon 触发,由其位置更改触发等)频繁更新其某些属性。 这意味着在应用程序的不同位置相应地更新 GUI,比如说 5 或 6 个类实例。

更新任何属性后立即更新应用中显示的信息的正确方法是什么?

我想过

1) 在自己的[IWSession session].currentUser 上添加 KVO,并为有关以下链接的所有属性添加 KVO Key Value Observing - how to observe all the properties of an object?

2) KVO 会触发一个

  [[NSNotificationCenter defaultCenter] postNotificationName:@"userUpdated" object:nil];

所有需要更新其布局的类都会听取该通知。

这是一个好方法吗? 还有什么建议吗?

【问题讨论】:

    标签: ios objective-c nsnotificationcenter key-value-observing


    【解决方案1】:

    如果您使用通知,则不会为发布通知的所有对象释放内存。因为如果您使用通知,则对对象的引用存储在堆中。所以我不认为使用通知是个好主意。

    【讨论】:

    • 还有其他建议吗?谢谢
    【解决方案2】:

    我最近一直在使用哈希表的弱观察者列表

    mObservers = [NSHashTable weakObjectsHashTable];
    

    带有半委托消息,例如:

    @protocol UserSessionObserver <NSObject>
    - (void) userSession:(id)session didUpdateUser:(id)userProfile;
    @end
    

    因此,任何对更改 userProfile 或 userSession 感兴趣的对象都可以简单地将自己作为临时观察者添加到共享的 userSession 中。因为它是一个弱入口,所以对象会在 dealloc 上自动从观察者表中移除。

    诀窍是创建正确的 addObserver 消息:

    - (void) addObserver:(__weak id<UserSessionObserver>)observer;
    

    虽然这需要您编写自己的观察者逻辑,但这也意味着: 1. 强保留周期没有内存管理问题, 2. 简化且切中要害的观察者消息传递(系统通知和 KVO 实现是如此通用,它接近于难以理解的 imo,但也增加了几层逻辑,只会减慢处理速度)。

    一个示例实现:Weak Observer example

    【讨论】:

      猜你喜欢
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 2021-04-16
      • 1970-01-01
      相关资源
      最近更新 更多