根据上节的介绍
@interface Bus : NSObject
/**
* 各业务BU注册busOjbect到总线,方便接收总线发起的调用
*
* @param busObj 业务模块的busObject
*/
+ (void)register:(BusObject *)busObj;
/**
* 数据总线,跨业务模块同步调用
*
* @param binuessName 业务名
* @param param 调用所带参数,可变长参数,注意参数均为Object类型
*
* @return 同步调用返回的结果
*/
+ (id)callData:(NSString *)buinessName param:(NSObject *)param, ... NS_REQUIRES_NIL_TERMINATION;
@end
@interface Bus()
@property (nonatomic, strong) NSMutableDictionary *BusObjectMap;
//用于存放对外接口子系统的类关系
@end
static Bus *g_bus;
@implementation Bus
+ (void)initializeBusIfNeed {
if (g_bus == NULL) {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
g_bus = [[Bus alloc] init];
});
}
}
+ (Bus *)sharedInstance {
[Bus initializeBusIfNeed];
return g_bus;
}
+ (BusObject *)busObjectForName:(NSString *)bizName {
OSSpinLock spinLock = OS_SPINLOCK_INIT;
OSSpinLockLock(&spinLock);
NSDictionary *busObjectMap = [Bus sharedInstance].BusObjectMap;
NSArray *hostList = [busObjectMap allKeys];
NSString *findKey = nil;
for (NSString *aKey in hostList) {
if ([[bizName lowercaseString] hasPrefix:[aKey lowercaseString]]) {
findKey = aKey;
break;
}
}
BusObject *busObj = [busObjectMap valueForKey:findKey];
OSSpinLockUnlock(&spinLock);
if (![busObj isKindOfClass:[BusObject class]]) {
NSAssert(false, @"找不到bizName:[%@]对应的busObject",bizName);
}
return busObj;
}
- (id)init {
if (self = [super init]) {
self.BusObjectMap = [NSMutableDictionary dictionary];
}
return self;
}
+ (void)register:(CTBusObject *)busObj {
OSSpinLock spinLock = OS_SPINLOCK_INIT;
OSSpinLockLock(&spinLock);
if ([[Bus sharedInstance].BusObjectMap valueForKey:busObj.businessNamePrefixAndURLHost]) {
NSAssert(false, @"host名=[%@]已注册,不可重复注册", busObj.businessNamePrefixAndURLHost);
}
[[Bus sharedInstance].dataBusObjectMap setValue:busObj forKey:busObj.businessNamePrefixAndURLHost];
OSSpinLockUnlock(&spinLock);
}
+ (id)callData:(NSString *)bizName param:(NSObject *)param, ... NS_REQUIRES_NIL_TERMINATION {
BusObject *busObj = [Bus busObjectForName:bizName];
NSMutableArray *paramArr = nil;
id eachItem;
va_list argumentList;
if (param != nil) {
paramArr = [NSMutableArray array];
[paramArr addObject: param];
va_start(argumentList, param);
while((eachItem = va_arg(argumentList, id))) {
[paramArr addObject: eachItem];
}
va_end(argumentList);
}
id ret = [busObj doDataJob:bizName params:paramArr];
return ret;
}
@end
@interface BusObject : NSObject
@property (nonatomic, readonly) NSString *businessNamePrefixAndURLHost;
- (id)initWithHost:(NSString *)host;
/**
* 数据总线,同步处理任务,需要子类重载
*
* @param businessName 业务名
* @param params 参数列表,列表中参数类型为对象
*
* @return 任务执行结果
*/
- (id)doJob:(NSString *)businessName
params:(NSArray *)params;
@end
@interface BusObject() {
NSString *bizNamePrefix;
NSString *urlHost;
}
@end
@implementation BusObject
- (id)initWithHost:(NSString *)host {
if (self = [super init]) {
urlHost = [host lowercaseString];
}
return self;
}
- (NSString *)businessNamePrefixAndURLHost {
return urlHost;
}
- (id)doJob:(NSString *)businessName params:(NSArray *)params {
//TO BE OVERRIDE
return NULL;
}
@end
NSDictionary *busMap = @{ @“MainBusObject":@“main",
@“Bu1BusObject":@“bu1",
@“Bu2BusObject":@“bu2",
};
[busMap enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
BusObject *busObject = [[NSClassFromString((NSString *)key) alloc] initWithHost:(NSString *)obj];
[Bus register:busObject];
}];
#import "BusObject.h"
@interface Bu1BusObject : BusObject
@end
#import "Bu1BusObject.h"
@implementation Bu1BusObject
- (id)doJob:(NSString *)businessName params:(NSArray *)params {
if ([businessName isEqualToString:@"bu1/hello"]) {
NSLog(@"Hello");
}
}
@end
[CTBus callData:@“bu1/hello" param:nil]