Receptionist Pattern
来源:互联网 发布:多功能乐器软件 编辑:程序博客网 时间:2024/06/06 01:22
KVO notification会立马调用 observer 的observeValueForKeyPath:ofObject:change:context:方法,如果 observer 在子线程中实现该方法,那么,该方法同样返回在相同的线程.
为了实现这一模式,首先,你需要定义一个receptionist类,包含一个属性的观察者,然后需要一个把这个 KVO 通知转换成一个界面更新任务的方法, 这个函数需要知道它所观察的对象,具体发生变化的属性,相应的界面变化,和在哪个队列中执行代码. 如下面示例所示:
@interface RCReceptionist : NSObject { id observedObject; NSString *observedKeyPath; RCTaskBlock task; NSOperationQueue *queue;}
其中,这个 block 中需要这样定义:
typedef void (^RCTaskBlock)(NSString *keyPath, id object, NSDictionary *change);
这些参数类似于observeValueForKeyPath:ofObject:change:context:函数,接下来这个类还需要声明一个工厂方法,包含 block 作为参数:
+ (id)receptionistForKeyPath:(NSString *)path object:(id)obj queue:(NSOperationQueue *)queue task:(RCTaskBlock)task;
具体实现:
+ (id)receptionistForKeyPath:(NSString *)path object:(id)obj queue:(NSOperationQueue *)queue task:(RCTaskBlock)task { RCReceptionist *receptionist = [RCReceptionist new]; receptionist->task = [task copy]; receptionist->observedKeyPath = [path copy]; receptionist->observedObject = [obj retain]; receptionist->queue = [queue retain]; [obj addObserver:receptionist forKeyPath:path options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:0]; return [receptionist autorelease];}
此处,需要对 block 进行 copy, 因为 block 很有可能是在栈中创建的,必须拷贝到堆中,这样在 KVO 通知分发出去的时候才能继续保持在内存中.
接下来,类还需要实现observeValueForKeyPath:ofObject:change:context:方法,
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { [queue addOperationWithBlock:^{ task(keyPath, object, change); }];}
这段代码只是简单的将刷新任务放入到接收的指定队列中,并且将观察对象的属性变化放入 block 中传递出去,此处 task 被将封装成NSBlockOperation对象用来在队列中执行任务.
需要更新界面的对象在创建receptionist对象时,提供具体的界面更新代码,注意,当创建receptionist对象时,需要传递具体 block 需要执行在哪个queue中,在这段示例代码中,是主线程.
RCReceptionist *receptionist = [RCReceptionist receptionistForKeyPath:@"value" object:model queue:mainQueue task:^(NSString *keyPath, id object, NSDictionary *change) { NSView *viewForModel = [modelToViewMap objectForKey:model]; NSColor *newColor = [change objectForKey:NSKeyValueChangeNewKey]; [[[viewForModel subviews] objectAtIndex:0] setFillColor:newColor]; }];
- Receptionist Pattern
- pattern
- pattern
- Pattern
- Pattern
- Pattern
- Pattern
- Pattern
- (?:pattern) (?=pattern) (?!pattern)
- 正则表达式之 pattern+?、pattern*?、(?!pattern)、(?:pattern)
- Iterator Pattern & Composite Pattern
- Design pattern----Facade Pattern
- Design pattern----Strategy Pattern
- Design Pattern --------Observer pattern
- Design Pattern --- Factory Pattern
- Javascript Pattern Module pattern
- <url-pattern>/*</url-pattern>
- Design Pattern - Factory Pattern
- SqlServer 触发器
- centOS6.3(64bit)Hadoop的Eclipse开发环境搭建
- C++笔记
- C运行库
- hdu2899——Strange fuction
- Receptionist Pattern
- 第一篇博客 2014年11月7日 为了记住。
- 先presentModalViewController后pushViewController没有效果的解决方法
- 查看oracle监听情况
- ThreadLocal类型变量为何声明为静态?- ThreadLocal实现原理
- OC5_NSDictionary_NSSet
- uva 714 Copying Books 最大值最小化 附测试数据
- socket案例
- Ubuntu下Eclipse开发Android经常崩溃的解决方法