用Key-Value Observing解耦视图控制器
来自:http://www.think-in-g.net/ghawk/blog/2012/02/decoupling-view-controllers-with-key-value-observing/
首 先,将数据容器剥离到控制器以外。其次,将各个控制器之间的依赖关系切断,在控制器初始化后,通过KVO机制注册成为数据源的观察者。而数据源只需要完成 自己的更新任务,当属性发生变化后,runtime会自动通知其观察者。这样,各个对象就无须关心对方的生命周期,能大大减少逻辑上的杂音。
简单写点代码示例:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
@implementation MyViewController- (void)viewDidLoad { //初始化时注册成为观察者 id dataSource = [MyDataSource sharedInstance]; [dataSource addObserver:self forKeyPath:@"newItems" options:NSKeyValueObservingOptionNew context:NULL];}- (void)fetchUpdates { [[MyDataSource sharedInstance] fetchData];}- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { // 取得新数据后更新table view。 if ([keyPath isEqualToString:@"newItems"]) { [self refreshListView]; }}//...@end@implementation MyTabbarController- (void)viewDidLoad { //初始化时注册成为观察者 id dataSource = [MyDataSource sharedInstance]; [dataSource addObserver:self forKeyPath:@"newItems" options:NSKeyValueObservingOptionNew context:NULL];}- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { // 取得新数据后更新 badge。 if ([keyPath isEqualToString:@"newItems"]) { [self displayBadgeOnTabbar]; }}//...@end |
基本上就是这样,只要对代码稍作改动,就能充分利用KVO实现视图控制器的解藕。而且,KVO的功能很强大,比如能在通知时提供属性变更前后的信息等等,好好利用可以节省不少代码。
浙公网安备 33010602011771号