MGJRouter 蘑菇街组件结束原理

计划一 url-block

这是蘑菇街中运用的一种页面间调用的方法,经过在启动时注册组件供给的服务,把调用组工商银行件运用的url和组件供给的服务appearblock对应起来,保存到内存中。在运用组件的服务时,经过url找到对应的block,然后获取服务。

注册龚俊

[M公积金GJRouter 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界说服务接口,组google件经过结束该接口来供给接口界说的服务,具体结束便是把protocol和class做一个映射接口文档,一同在内存中保存一张映射表,运用的时分,就经过protocol找到对应的class来获取需求的服务。

注册:

[ModuleManager registerClass:ClassA forProtocol:ProtocolA]

调用接口的效果

[ModuleManager龚俊 claapp安装下载ssForProtocol:ProtocolA]

蘑菇街的这种计划的确处理了方接口卡案一中无法传递非常规参数的问题,使得组件间的调用更为便当,可是它依然没有处理组件依托中间件公积金的问题、内存中保护映射表的问题、组件的松散调用的问题。规划思维和计划一相似,都是经过给组件加了一层wrapper,然后给运用者接口测验的流程和过程调用。

计划三、target-action

casa的计划是经过给组件包装一层wrapper来给外界供给服务,然后调用者经过依托中间件来运用服务;其间,中间件是经过runtime来调用组件的服务,是真实意义上龚俊的解耦,也是该计划最中心的当地。具体实施进程是给组件封装一层target对象来对外供给服务,不会对原来组件构成侵犯;然后,经过结束中间件的category来供给服务给调用者,宫颈癌这样运用者工商银行只需求依托中间件,而组件则不需求依托中间件。
也便是每个组件创建一个target类(由组件开发者保护),其内部界说了组件对外暴露的action(方法)。和组件通讯时,其实质是调用一个特定的target-action的方法。target类的类名有必要以Target_开端,比方Target_A,action的方法名有必要以appstoreActi公积金on_开端,比方Action_nativeFetchDetailViewController。留心,暴露出来的这个target类并不是这个接口测验的流程和过程组件的龚俊具体结束,它只是为了便当调用者运用,target类的完接口和抽象类的差异结文件中会引入组件的头文件,结束声明文件中的功用,然后达到调用组件的目的。

运用者只需求依托中宫颈癌早期症状间件,而中间件又不依托组件,这是真实意义上的解耦。可是casa的这个计划有个问题便是hardcode,在中间件的category里有hardcode,casa的解说是在组件间调用时,最好是去model化,所以不行避宫崎骏免的引入了hardcode,并且一切的hardcode只存在于分类中。针对这个问题,有人appreciate提议,把一切的model做成组件化下沉,然后让一切的组件都可以安闲的拜访mode枸杞l,不过在我看来,这种计划虽然处理了组件龚俊间传递model的依托问题,可是为了处理这个小问题,直接把整个model层组件化后暴露给一切组件,简单构成数据泄露,付出的价值有点大。针对这个问题,经过和网友谈论,共approve同觉得组件间调用时用字典传递数据,组件内调用时用model传递数据,这样即削减组件间数据对model的耦合,又便当了组件内运用model传递数据的快捷性。