服务
在App开发过程中,我们可以把没有UI界面并通用的功能,抽象为服务。TMFServiceContext为您提供了注册服务并随时跨模块调用服务的功能,以便您的App工程进行模块化解耦。
继承协议
在您的实现具体服务的类中引入TMFRouter.h头文件
#import "TMFRouter.h"
实现协议TMFServiceContextProtocol
@interface TMFServiceTestA ()<TMFServiceContextProtocol>
@end
@implementation TMFServiceTestA
+ (void)registerService {
}
@end
页面路由注册方法
在+(void)registerService中,提供了注册服务的方法:
+ (void)registerServiceURL:(NSString *_Nonnull)serviceURL instanceHandler:(TMFServiceContextInstanceHandler _Nonnull)instanceHandler toObjectHandler:(TMFServiceContextInstanceAndResultHandler _Nonnull)handler;
服务注册时,instanceHandler要传入您的服务类的实例并返回,handler会传一个字典,包含了注册的 URL 中对应的变量,无返回值。具体使用方式如下:
[TMFServiceContext registerServiceURL:@"service://get/date" instanceHandler:^id{
return [[TMFServiceTestA alloc] init];;
} toObjectHandler:^id(id _Nonnull instance, NSDictionary * _Nonnull serviceParameters) {
TMFServiceTestA *testA = (TMFServiceTestA *)instance;
NSString *action = serviceParameters[@"action"];
if ([action isEqualToString:@"test"]) {
[testA test];
return nil;
} else if ([action isEqualToString:@"getTime"]) {
NSTimeInterval time = [serviceParameters[@"time"] integerValue];
return [testA getDate:time];
}
return testA;
}];
注意:serviceParameters里包含了传递各种参数,如果是基本类型参数,可以直接在serviceParameters中取到(这主要取决于您调用时把基本类型参数放到了哪里,请参阅调用方式),如果是block,则需要serviceParameters.routerUserInfo中提取。
调用注册函数
TMFServiceContext并不推荐在+(void)load;中注册路由,因为这会拖慢App启动速度,所以您需要在服务类中实现TMFServiceContextProtocol协议,并在合适的时机去注册服务,推荐在AppDelegate的didFinishLaunchingWithOptions中注册,注册方式如下:
NSArray<NSString *> *array = @[@"TMFServiceTestA"];
NSBundle *bundle = [NSBundle bundleForClass:self.class];
NSString *bundleName = [bundle.bundlePath.lastPathComponent componentsSeparatedByString:@"."].firstObject;
for (NSString *aClassName in array) {
Class aClass = NSClassFromString(aClassName);
if (!aClass) {
aClass = NSClassFromString([NSString stringWithFormat:@"%@.%@", bundleName, aClassName]);
}
if (aClass) {
id<TMFServiceContextProtocol> p = (id<TMFServiceContextProtocol>)aClass;
[p registerService];
}
}
如果您的工程采用分模块的开发方式,推荐每个模块的头文件也继承TMFServiceContextProtocol协议,并实现+ (void)registerService;方法,将上述代码放到此方法实现中,再在AppDelegate的didFinishLaunchingWithOptions中调用模块的registerService方法注册。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSArray<NSString *> *array = @[@"TMFServiceModule1", @"TMFServiceModule2"];
for (NSString *aClassName in array) {
Class aClass = NSClassFromString(aClassName);
if (aClass) {
id<TMFServiceContextProtocol> p = (id<TMFServiceContextProtocol>)aClass;
[p registerService];
}
}
}
调用方式
NSString *result = [TMFServiceContext executeServiceWithURL:[@"service://get/date" appendingParams:@{@"action":@"getTime",@"time":@(0)}]];
参数可以拼接到URL中进行传递。