编码规范
操作系统: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。它看起来是这样的:
手动注册
首先创建执行对象 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