上一篇讲了一下目前页面跳转路由之间的解耦。
这一篇就来说一些组件之间业务解耦。
你觉得应该怎么来实现组件之间的业务解耦?听我来讲吧。
有没有想过通过协议来进行组件化之间的解耦。
针对不同的组件创建不同的ServiceProtocol.
就比如登录模块,我们可以这么写。
@protocol LoginServiceProtocol <RouterProviderProtocol>
/// 用户id
- (NSString *)getUserId;
/// 退出登录提示,后端返回文本
- (void)loginOutWithDialog:(NSString *)text;
/// renlei MyLogout
- (void)loginOutWithSuccess:(void(^)(id lParam,id rParam))success
Fail:(void(^)(id lParam,id rParam))fail;
@end
我们需要在app启动的时候,拿取所有的 继承RouterProviderProtocol的协议。
我这边是写到路由的RouterConfiguration单例中的
- (void)initializationData {
NSMutableArray *appDelegateClass = [NSMutableArray array];
NSMutableSet *modularsSet = [NSMutableSet set];
NSMutableDictionary *provideServiceDict = [NSMutableDictionary dictionary];
unsigned int outCount = 0;
Class *classes = objc_copyClassList(&outCount);
for (int i = 0; i < outCount; i++) {
Class cla = classes[i];
NSString *claName = NSStringFromClass(cla);
/// 供应者服务
if (class_conformsToProtocol(cla, @protocol(ZPMRouterProviderProtocol))) {
unsigned int count;
Protocol * __unsafe_unretained * protocolList = class_copyProtocolList(cla, &count);
for (NSInteger i = 0; i < count; i++) {
Protocol *protocol = protocolList[i];
if (protocol_conformsToProtocol(protocol, @protocol(ZPMRouterProviderProtocol))) {
NSString *key = [NSString stringWithUTF8String:protocol_getName(protocol)];
[provideServiceDict setObject:cla forKey:key];
break;
}
}
}
}
free(classes);
self.provideServiceDict = [provideServiceDict copy];
}
现在我们所有的协议对象都存在了provideServiceDict中。
我们新建一个appService服务对象。
就比如新建一个loginSerivice变量,通过重写他的get方法。
去拿取对应的service类对象。
+ (id<loginServiceProtocol>)loginService {
return [[Router router] getProviderService:@protocol(loginServiceProtocol)];
}
- (id)getProviderService:(Protocol *)protocol {
Class<ZPMRouterProviderProtocol> aCla = [self getProviderServiceClass:protocol];
BOOL isResponds = [aCla respondsToSelector:@selector(routerProviderInstance)];
NSAssert(isResponds, @"%@ 未实现 【routerProviderInstance】",NSStringFromProtocol(protocol));
if (isResponds) {
return [aCla routerProviderInstance];
}
return nil;
}
- (Class)getProviderServiceClass:(Protocol *)protocol {
NSString *key = NSStringFromProtocol(protocol);
if (key) {
return [ZPMRouterConfiguration getProvideServiceDict][key];
}
return nil;
}
在loginService中实现routerProviderInstance方法。来新建这个服务的实例。
+ (id)routerProviderInstance {
return [Service sharedInstance];
}
+ (instancetype)sharedInstance {
static loginService *login = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
login = [[loginService alloc] init];
});
return login;
}
loginservice对象需要实现loginServiceProtocol协议,并实现相应的方法。
下面我们就可以在其他组件中,通过这个实例对象来处理这个组件中的业务逻辑,从而实现组件之间的解耦
[[APPService loginService] getUserId];
网友评论