基于OC的基礎(chǔ)Router實(shí)現(xiàn)

Route

路由實(shí)現(xiàn)功能

  • 使用
  • api導(dǎo)航
  • 服務(wù)導(dǎo)航
  • 總結(jié)

使用

解析參數(shù)

  url = XXX://page/detail?goodId=12345
  
  
  [[Route shared] routeWithUrl:url completion:nil];
 //url對應(yīng)參數(shù) 
  這個方法中主要采用了prengine(我老大寫的一個基于nginx的解析框架)來進(jìn)行解析 

傳入?yún)?shù)調(diào)用

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

路由規(guī)則

scheme://routeType/value/parameters

| 類型 | 參數(shù) | 示例|
| :--------: | :--------:| :--: | :--:|
| page | goodId=12345 |xxx://page/detail?goodId=12345|
| api | userId=12345 | xxx://api/GetCouponTf8Model?userId=12345 |
| server | | xxx://server/doLogin |

  • 頁面導(dǎo)航、app喚起

Router中一共使用了一張plist表格來做配置文件

RouterPlist.png
  • page跳轉(zhuǎn)最后的解決方案

    在父類controller里面增加這一個方法暫定為routejump需要傳入的參數(shù)應(yīng)該是controller 的class,以及這個controller需要的參數(shù),這里主要還是需要進(jìn)行一次參數(shù)校驗(yàn)。

    
 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實(shí)現(xiàn)方式
if ([clazz isSubclassOfClass:[UIViewController class]]) {
                
                NSString *actionString = [NSString stringWithFormat:@"pageRouteActionWithClass:parameters:completion:"];
                
                NSArray *parameterArr = hhDic[routeArr[0]];
                
                NSMutableDictionary *parameterKeyDic = [NSMutableDictionary dictionary];
                //通過這種方式去取對應(yīng)類的屬性 就不需要手動輸入了
                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的調(diào)用

這里我創(chuàng)建了Task基類通過類名映射的方式進(jìn)行調(diào)用

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

總結(jié)

基本上用的都是相對容易理解的代碼來完成了這一系列過程里面有使用一個nginx的解析工具prengine,思路比較清晰,用runtime里面的一些方法來完成頁面直接的解耦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,810評論 25 709
  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中。。。 其實(shí)如果沒有APIManager這一層是沒法使用delegate的,畢竟多個單...
    yhtang閱讀 5,466評論 1 23
  • b在岳麓山腳下穿梭,無數(shù)次聽聞它的古樸和深度,但從沒邁進(jìn)去一步,今天第一次來到這里。 先入眼簾的是上山的路下一扇普...
    悅和天使閱讀 1,279評論 0 0
  • 小河灣清清淺淺, 她蹲在光潔的石面。 手里握著捶衣棒, 捶得衣服“邦邦”響。 驚得冷風(fēng)的心也顫, 慌鉆入草叢逃竄。...
    巫果閱讀 244評論 8 3

友情鏈接更多精彩內(nèi)容