服务

在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中进行传递。

Copyright © 2013-2023 Tencent Cloud. all right reserved,powered by GitbookUpdate Time 2023-08-31 14:46:07

results matching ""

    No results matching ""