我的目标是实现 Node.js 的 EventEmmiter。
以及 KVO。
这受到了以下产品的启发。
需要 iOS 5.0 或更高版本,并使用 ARC。
对象 A (开启)
[[self class] arn_emitterOn:@"test" owner:self needMainThreadCall:YES callbackBlock:^(id resultObject){
// called MianThread
NSLog(@"A");
}];
对象 B (开启)
[[self class] arn_emitterOn:@"test" owner:self needMainThreadCall:NO callbackBlock:^(id resultObject){
// called not MianThread
NSLog(@"B");
}];
对象 C (触发)
[[self class] arn_emitterEmit:@"test" resultObject:nil];
// called objectA emitterOn
// called objectB emitterOn
[[self class] arn_emitterEmit:@"test" resultObject:nil];
// called objectA emitterOn
// called objectB emitterOn
对象 A (开启)
[[self class] arn_emitterOn:@"test" owner:self needMainThreadCall:YES callbackBlock:^(id resultObject){
// called MianThread
NSLog(@"A");
}];
对象 B (一次性)
[[self class] arn_emitterOnce:@"test" owner:self needMainThreadCall:NO callbackBlock:^(id resultObject){
// called not MianThread
NSLog(@"B");
}];
对象 C (触发)
[[self class] arn_emitterEmit:@"test" resultObject:nil];
// called objectA emitterOn
// called objectB emitterOnce
[[self class] arn_emitterEmit:@"test" resultObject:nil];
// called objectA emitterOn
对象 A (开启)
[[self class] arn_emitterOn:@"test" owner:self needMainThreadCall:YES callbackBlock:^(id resultObject){
// called MianThread
NSLog(@"A");
}];
对象 B (关闭)
[[self class] arn_emitterOnce:@"test" owner:self needMainThreadCall:NO callbackBlock:^(id resultObject){
// called not MianThread
NSLog(@"B");
[self class] arn_emitterOff:@"test" owner:self];
}];
对象 C (触发)
[[self class] arn_emitterEmit:@"test" resultObject:nil];
// called objectA emitterOn
// called objectB emitterOn
[[self class] arn_emitterEmit:@"test" resultObject:nil];
// called objectA emitterOn
注意!!
可以使用以下方式更换实现:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
KVO
MyObject *objA = MyObject.new;
MyObject *objB = MyObject.new;
objA.count = 0;
objB.count = 0;
[objA arn_emitterObserve:objB keyPath:@"count" isOnce:NO needMainThreadCall:NO callbackBlock:^(id resutObject) {
objA.count++;
}];
objB.count++;
// call arn_emitterObserve
objB.count++;
// call arn_emitterObserve
// objA.count == 2
源代码在非病毒 MIT 许可协议下分发。
这是最简单、最宽容的许可协议。
Node.js 圈广泛使用的 EventEmitter 对象在 Objective-C 中实现。
(并不与 Node.js 的 EventEmitter 对象具有相同的功能)