SBSimpleRouter 1.0.4

SBSimpleRouter 1.0.4

subing 维护。



  • subing

编码规范

操作系统:macOS 开发软件:Xcode 9.0及以上

基本

项目开始

1.APP采用纯Objective-C代码开发,不使用故事面板(storyboard)
2.布局我们采用Masonry布局。
3.设计模式 MVC。
4.使用YTKNetworking(AFNetworking的再封装)作为网络请求引擎。
https://github.com/yuantiku/YTKNetwork
5.使用cocoapods进行库的统一管理,使用方便,清晰明了。
6.使用git管理代码,团队开发,目前放在OSChina上,请下载SourceTree客户端进行git操作。
7.数据库操作

目录结构

pod 'SBSimpleRouter'

路由格式(host#action?params)

在注册和调用之前,我们介绍路由格式的定义,这非常重要。
简单的格式是这样的:host#action?params,非常清晰简洁。

  • host,理解为业务模块或功能逻辑的简单规划,例如,它看起来应该是这样的:UserCenter/login,用'/'进行层叠递进,我将其定义为:用户中心的登录业务模块。

  • action,理解为调用的事件,应当是抽象化的,例如,承接上面的login模块,假设该模块有一个loginWithAcount:Password:的方法,可以完成提供账号密码并在服务器返回登录验证的事件,它看起来应该是这样的 #callLogin,定义为调起登录,其中#是事件前缀,callLogin是抽象的事件名称。

  • params,理解为参数格式,请注意它只是约定格式的抽象字符形式,千万不要在这里传入你真正的参数,还有记住第一个参数符号是方法的返回值类型,所以注册一个方法,那么它的参数字符串是>=1,因为必须有一个 return_type。例如,还是承接上面的login,在#callLogin这个事件上,登录操作通常是异步回调,所以这里我们需要传入一个 returnType 是 void,在路由格式里面它是v,还有两个参数,acount 和 password,它们都是字符串类型,所以params会是这样的:?v@@,其中'?'是参数类型前缀,@代表一个对象类型。

  • 总结起来,一个完整的路由是这样的:
    UserCenter/login#callLogin?v@@ 这个调用使用了用户登录模块的 callLogin 事件,返回类型是 v,参数类型是 @@。

关于 param 的类型标记

  • 1. 对象类型包括 block,一律用 @ 符号表示。
  • 2. 原始类型,比如,int = i,float = f,double = d,这与运行时定义的参数类型是一致的。
  • 3. void = v。
  • 4. typeof structure 结构体需要转换成对象类型,所以是 @。

Regist 注册

一般概念

注册分为三种样式,在介绍这三种样式之前,我们首先要了解注册的一般概念和结构。

  • 概念:我们可以把一对注册和调用的相互关系看作是 value-key,注册可以比喻为 setObject:forKey:,调用可以比喻为 objectForKey:。当然,注册必须在调用之前发生,否则会有无效的调用。

  • 结构:注册是一种对象化的操作,注册的模块一般是一个类,它被作为接收对象(receiveObject)放置在注册表中,route 代表它对应的 key。receiveObject 包含一个 methodList,methodList 是方法的集合,receiveObject 注册的方法都包含在其中,#action 作为一个方法的 key。它看起来是这样的:

image

手动注册

首先创建执行对象 ReceiveObject,然后为 ReceiveObject 添加 method,最后把 ReceiveObject 加入注册表,下面是一个完整的示例,

//第一步 创建 方法执行对象 SBSReceiveObject 如下:TestViewController  一般为类名    Test/TestVC 业务模块/具体业务或功能抽象名称
    SBSReceiveObject *object = [SBSReceiveObject initWithClass:@"TestViewController" hostUrl:@"Test/Mock_Object"];
    //第二步 添加 方法对象
    [object addMethod:[SBSMethodObject instanceMethodName:@"playMusicWithSource:" parameter:@"v@"] forKey:@"playMusic"];
    [object addMethod:[SBSMethodObject instanceMethodName:@"addNumber:other:" parameter:@"iii"] forKey:@"addMethod"];
    //字典添加
    [object addMethods:@{@"inputName":[SBSMethodObject classMethodName:@"inputName:" parameter:@"v@"],@"testBlock":[SBSMethodObject instanceMethodName:@"myBlock:" parameter:@"v@"]}];
    //第三步 提交注册 注意不要注册 相同路径 hostURL的对象 后一个会覆盖前一个
    [[SBSimpleRouter shareRouter] registObject:object forRoute:object.hostUrl];

自动注册

自动注册,顾名思义,不需要你一个一个对象地添加,只需在目标类中做一些特殊的操作即可,像这样,

+ (void)load{
    SBRouteAutoRegistWithHost(@"Test/TestAuto");
}
#pragma mark - 主动注册方法
- (void)playMusic__playMusicWithSource:(id)source{
    NSLog(@"playing music : %@",source);
}

- (int)addMethod__addNumber:(int)num other:(int)other{
    return num+other;
}
+ (void)inputMethod__inputName:(NSString *)name{
    NSLog(@"%@",name);
}
- (void(^)(NSString *msg))blockMethod__myBlock:(void(^)(NSString *msg))block :(void(^)(NSString *msg))block1{
    if (block) {
        block(@"我错了");
    }
    return nil;
}

首先在 +load 方法中需要加入宏方法,参数为目标路径 host SBRouteAutoRegistWithHost(@"Test/TestAuto")。

然后就是你需要注册的方法了,使用 '' 双下划线作为一个特殊标记位,在其前面定义为 method 的 key,它的结构是这样的 method...,不允许使用多对双下划线函数名称。

就这样,我们在上面注册了 4 个方法。它们看起来非常简洁。

自定义注册

自定义注册是一种特殊的注册扩展,它看起来像是一个 block,确实是这样,只需提供一个自定义的 block 和一个特定的 route 即可。它看起来是这样的,

//拨电话
    [[SBSimpleRouter shareRouter] registHandleBlock:^id(NSArray *params) {
        NSString *phone = [NSString stringWithFormat:@"tel://%@",params.firstObject];
        [[UIApplication sharedApplication]openURL:[NSURL URLWithString:phone]];
        return nil;
    } forFullRoute:@"Test/CustomTest#call?v@"];

在上面的例子中,我自定义注册了一个系统 dial 方法,它看起来也很简单。

调用

与注册相比,调用有两种方式:对象调用和block调用。

 对象调用

对于注册类型为实例方法,也就是 '-' 的方法()

- (BOOL)playMusicWithSource:(id)source;

,通常选择对象调用的方式,直接返回:

BOOL playSuccess = [object callActionRequest:routeUrl params:@"http://musicUrl"];

block返回:

[object callActionRequest:routeUrl params:@"http://musicUrl" response:^(id response, NSString *url, BOOL success, NSError *error){
	nslog(@"response : %@",response);
}];

routeUrl:路由 params:参数,这里是实际上的参数。例如,传入一个 URL 播放地址。

block 调用

对于注册类型为类方法('+')或自定义注册的方法

+ (void)inputName:(NSString *)name;

通常选择这种调用方式,直接返回:

[[SBSimpleRouter shareRouter] callActionRequest:routeUrl params:@"subing"];

block返回:

[[SBSimpleRouter shareRouter] callActionRequest:routeUrl params:@"subing" response:^(id response, NSString *url, BOOL success, NSError *error){
	nslog(@"response : %@",response);
}];

License

MIT