基于OC的基础Router实现

Route

路由实现功能

  • 使用
  • api导航
  • 服务导航
  • 总结

使用

解析参数

  url = XXX://page/detail?goodId=12345
  
  
  [[Route shared] routeWithUrl:url completion:nil];
 //url对应参数 
  这个方法中主要采用了prengine(我老大写的一个基于nginx的解析框架)来进行解析 

传入参数调用

在这里scheme =XXX; server = page; key = detail; 
parameter = {goodID = 12345}; 
[self routeWithScheme:scheme server:server key:key parameter:dic completion:nil]; 

路由规则

scheme://routeType/value/parameters

| 类型 | 参数 | 示例|
| :--------: | :--------:| :--: | :--:|
| page | goodId=12345 |xxx://page/detail?goodId=12345|
| api | userId=12345 | xxx://api/GetCouponTf8Model?userId=12345 |
| server | | xxx://server/doLogin |

  • 页面导航、app唤起

Router中一共使用了一张plist表格来做配置文件

RouterPlist.png
  • page跳转最后的解决方案

    在父类controller里面增加这一个方法暂定为routejump需要传入的参数应该是controller 的class,以及这个controller需要的参数,这里主要还是需要进行一次参数校验。

    
 NSMutableDictionary *parameterDic = [NSMutableDictionary dictionary];
    
 for (int i = 0; i < parameterArr.count; i++) {
     if (parameter[parameterArr[i]]) {
        [parameterDic setValue:parameter[parameterArr[i] forKey:parameterArr[i]];
     }               
 }

可以直接用KVC方式赋值,而需要特殊处理的子类,重写这个routejump的方法。

  • page实现方式
if ([clazz isSubclassOfClass:[UIViewController class]]) {
                
                NSString *actionString = [NSString stringWithFormat:@"pageRouteActionWithClass:parameters:completion:"];
                
                NSArray *parameterArr = hhDic[routeArr[0]];
                
                NSMutableDictionary *parameterKeyDic = [NSMutableDictionary dictionary];
                //通过这种方式去取对应类的属性 就不需要手动输入了
                unsigned int count;
                objc_property_t *properties = class_copyPropertyList(clazz, &count);
                
                NSMutableArray *clspatArray = [NSMutableArray array];
                for (int i = 0; i < count; i++) {
                    
                    objc_property_t property = properties[i];
                    
                    const char *cName = property_getName(property);
                    
                    NSString *name = [NSString stringWithCString:cName encoding:NSUTF8StringEncoding];
                    [clspatArray addObject:name];
                }
                
                [clspatArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                    
                    if (parameter[obj]) {
                        [parameterKeyDic setValue:parameter[obj] forKey:obj];
                    }
                    
                }];
                
                SEL action = NSSelectorFromString(actionString);
                Method m = class_getClassMethod(clazz, action);
                if (m) {
                    IMP imp = method_getImplementation(m);
                    BOOL (*imp1)(id,SEL,NSString *,NSMutableDictionary *,void (^)(NSDictionary *)) = (BOOL (*)(id,SEL,NSString *,NSMutableDictionary *,void (^)(NSDictionary *)))imp;
                    
                    imp1(clazz,action,routeArr[0],parameterKeyDic,completion);
                    
                }

  • server和api的调用

这里我创建了Task基类通过类名映射的方式进行调用

 Task *task = [[clazz alloc] init];
               
 task.parameter = parameter;
 task.callback = completion;
             
 [task excuteTask];

总结

基本上用的都是相对容易理解的代码来完成了这一系列过程里面有使用一个nginx的解析工具prengine,思路比较清晰,用runtime里面的一些方法来完成页面直接的解耦。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,859评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,977评论 25 708
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,242评论 1 23
  • b在岳麓山脚下穿梭,无数次听闻它的古朴和深度,但从没迈进去一步,今天第一次来到这里。 先入眼帘的是上山的路下一扇普...
    悦和天使阅读 1,143评论 0 0
  • 小河湾清清浅浅, 她蹲在光洁的石面。 手里握着捶衣棒, 捶得衣服“邦邦”响。 惊得冷风的心也颤, 慌钻入草丛逃窜。...
    巫果阅读 214评论 8 3