美文网首页
基于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实现

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