您的当前位置:首页正文

基于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]; 

路由规则

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