iOS组件化开发-中间层
组件化开发中,中间层是其中一种实现思路
首先,作为全局使用的中间层,单例是必然使用的
#import "Mediator.h"
#import <objc/runtime.h> //利用运行时来实现,runtime文件是必须的
@interface Mediator ()
@end
@implementation Mediator
static Mediator *mediator;
#pragma mark -单例
+ (instancetype)sharedInstance {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
mediator = [[Mediator alloc] init];
});
return mediator;
}
收发机制是本文的核心,也是组件化开发中,模块之间通信的根本
在此,使用performSelector来实现
- (id)performTarget:(NSString *)targetName action:(NSString *)actionName params:(NSDictionary *)params{
//目标类,为了整体统一方便管理,加上了TARGET_ 并创建了同名抽象类
NSString *targetNameStr = [NSString stringWithFormat:@"TARGET_%@", targetName];
//道理同上 在这个抽象类中也加入了统一管理的方法 以ACTION_开头
NSString *classActionStr = [NSString stringWithFormat:@"ACTION_%@:", actionName];
Class targetClass;
targetClass =NSClassFromString(targetNameStr);
target = [[targetClass alloc] init]; //建立类对象
SEL action = NSSelectorFromString(actionString); //指向事件的指针
if (target == nil) { //非空判断
return nil;
}
if ([target respondsToSelector:action]) {
//消除警告
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
if ([self checkReturnStyle:action target:target]) {//检测方法返回值是否为void
[target performSelector:action withObject:params]; //若为空,返回nil
return nil;
} else {
return [target performSelector:action withObject:params]; //不为空,返回方法执行完的值
}
#pragma clang diagnostic pop
}
return nil;
}
- (BOOL)checkReturnStyle:(SEL)aSelector target:(NSObject *)target {
Method meth = class_getInstanceMethod([target class], aSelector);
char returnType[512];
method_getReturnType(meth, returnType, 512);
if (returnType[0] != 'v') {
returnNO;
} else {
returnYES;
}
}
到此,一个简单的中间层就基本结束了,当然,可以在上面添加缓存处理,获得更好的性能