我有一个共享单例,其中包含有关当前用户及其会话的所有相关信息,通过对象[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];
所有需要更新布局的类都会收听该通知。
这是一个好方法吗? 还有其他建议吗?
答案 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,但也增加了几层逻辑,只会减慢处理速度)。