KVO,属性更改和通知

时间:2014-06-18 07:21:30

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

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

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

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

我想过

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

2)KVO然后会触发

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

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

这是一个好方法吗? 还有其他建议吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

mObservers = [NSHashTable weakObjectsHashTable];

使用半委派消息,例如:

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

因此,任何对userProfile或userSession的更改感兴趣的对象都可以简单地将自己添加为共享userSession的ad-hoc观察者。因为它是一个弱条目,所以该对象将自动从dealloc上的观察者表中删除。

Trick是创建正确的addObserver消息:

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

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

示例实现:Weak Observer example