MGJRouter 蘑菇街组件实现原理
方案一 url-block
这是蘑菇街中应用的一种页面间调用的方式,通过在启动时注册组件提供的服务,把调用组件使用的url和组件提供的服务block对应起来,保存到内存中。在使用组件的服务时,通过url找到对应的block,然后获取服务。
注册
[MGJRouter registerURLPattern:@"mgj://detail?id=:id" toHandler:^(NSDictionary *routerParameters) {
NSNumber *id = routerParameters[@"id"];
// create view controller with id
// push view controller
}];
调用:
- url的参数传递受到限制,只能传递常规的字符串参数,无法传递非常规参数,如UIImage、NSData等类型
- 没有区分本地调用和远程调用的情况,尤其是远程调用,会因为url参数受限,导致一些功能受限
- 组件本身依赖了中间件,且分散注册使的耦合较多
####方案二、protocol-class
针对方案一的问题,蘑菇街又提出了另一种组件化的方案,就是通过protocol定义服务接口,组件通过实现该接口来提供接口定义的服务,具体实现就是把protocol和class做一个映射,同时在内存中保存一张映射表,使用的时候,就通过protocol找到对应的class来获取需要的服务。
注册:
[ModuleManager registerClass:ClassA forProtocol:ProtocolA]
调用
[

本文探讨了蘑菇街的三种组件化方案:url-block、protocol-class和target-action,分析了各自的优缺点。url-block和protocol-class在参数传递和组件耦合上存在问题,而target-action实现了真正意义上的解耦。此外,文章还提到了组件间数据传递的策略,并分享了iOS面试题资源链接。
最低0.47元/天 解锁文章
832

被折叠的 条评论
为什么被折叠?



