用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的功能很强大,比如能在通知时提供属性变更前后的信息等等,好好利用可以节省不少代码。

posted on 2012-11-15 17:43  无量少年  阅读(236)  评论(0)    收藏  举报

导航