Protocol Proxy 组件事件

  1. Proxy转发
  2. 结果

最近写的代码中,遇到了一个问题,我的需求如下:

  1. 模块A 的方法调用 需要转发给其他模块
  2. 模块A 调用转发最好能直接出语法提示
  3. 接收者 应该实现相应的方法, 要有约束性

想了一下,这样写能满足我的需要

  1. 对于模块A的事件抽象成 -> ModuleATrigerEvents Protocol
  2. 接收模块遵循 ModuleATrigerEvents Protocol
  3. 利用Proxy转发给多个其他模块

Proxy转发

怎么出语法提示?
Proxy也遵循 ModuleATrigerEvents 协议,但不实现,从编译器角度,提供了语法提示。从抽象的角度,Proxy遵循协议对外表示了他转发的能力(虽然OC runtime可以随便转…)。

1
@interface OAPMModuleEventTriger : NSProxy<OAPMCPUEventListenerProtocol>

多转发
通过Invocation让多个对象可以调用方法

我们转发方法肯定是发给那些有相应实现的模块,所以 -respondsToSelector: 可以保证这一点。

1
2
3
4
5
6
7
8
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
for (id target in _targets) {
if ([target respondsToSelector:sel]) {
return [target methodSignatureForSelector:sel];
}
}
return [NSMethodSignature signatureWithObjCTypes:"v@:@"];
}

return [NSMethodSignature signatureWithObjCTypes:"v@:@"] 为了防止 methodsignature 为 nil 的情况。这个东西也用不到,因为 -forwardInvocation: 也会做-respondsToSelector:的判断。

1
2
3
4
5
6
7
8
9
10
- (void)forwardInvocation:(NSInvocation *)invocation {
SEL sel = invocation.selector;
for (id target in _targets) {
if ([target respondsToSelector:sel]) {
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[invocation invokeWithTarget:target];
});
}
}
}

结果

调用:

1
[[OAPMManager shared].moduleEventTriger updateCPUNumber:@1];

接收:

1
2
#pragma mark - OAPMCPUEventListenerProtocol
- (void)updateCPUNumber:(NSNumber *)number {}

因为只是在我的即将开源项目里玩玩,所以兼容性安全性都可能有问题。

script>