美文网首页
基于OC的基础Router实现

基于OC的基础Router实现

作者: zzzzzero | 来源:发表于2017-03-14 18:29 被阅读73次

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里面的一些方法来完成页面直接的解耦。

相关文章

  • 基于OC的基础Router实现

    Route 路由实现功能 使用 api导航 服务导航 总结 使用 解析参数 传入参数调用 路由规则 scheme:...

  • 关于 vue-router 动态权限 实现的方案

    基于vue-router的动态权限实现方案vue+vue-router+vuex,利用vue-router2.2....

  • iOS OC对象总结

    OC的实现 OC的对象、类主要是基于C、C++的结构体来实现的。编写的 OC代码,底层实现其实都是C、C++代码。...

  • OC 对象的本质

    OC的本质 我们平时写的OC代码的底层都是c/c++代码实现的 OC的面向对象都是基于c/c++的数据结构实现的 ...

  • AFNetworking与ASIHTTPRequest的区别

    一、底层实现 1、AFN的底层实现基于OC的NSURLConnection和NSURLSession 2、ASI的...

  • AFNetworking与ASIHTTPRequest的区别

    一、底层实现 1、AFN的底层实现基于OC的NSURLConnection和NSURLSession 2、ASI的...

  • oc对象本质

    OC代码底层实现都是c/c++,oc的类和对象都是基于c/c++的结构体实现的 1.nsobject的底层实现就是...

  • 01-OC对象的本质

    OC对象的本质 我们平时编写的OC代码,最终转换为底层实现基本上绝大部分都是基于C\C++来实现的 下面展示OC代...

  • OC对象

    OC的本质 oc代码,底层是由c/c++实现 Objective-C的面向对象都是基于C\C++的数据结构实现的 ...

  • OC 对象的底层本质

    OC 的本质 我们平时编写的OC 代码 底层实现其实都是C\C++ 代码 所以OC 的面向对象都是基于C/C++的...

网友评论

      本文标题:基于OC的基础Router实现

      本文链接:https://www.haomeiwen.com/subject/ggubgttx.html