HHRoute源碼解讀

1.注冊URL,HHRoute中的“route”是沒有schem的,他的造型有兩種:

1."user/name/"

url 匹配結果
"/user/name/xiaoming" 不匹配
"/user" 不匹配
"/user/name" 匹配

只有和1一毛一樣的才匹配成功

2."user/:name"

url result
"/user" 匹配
"user/xiaoming/" 匹配
"/user/name/xiaoming" 不匹配

同時傳個目標控制器一個params{“name”:“xiaoming”},只要目標控制器實現一個setParams方法即可取出其中參數賦值

-(void)map:(NSString *)route toControllerClass:(Class)controllerClass;

注冊一個路徑地址和controller對應

-(void)map:(NSString *)route toBlock:(HHRouterBlock)block;

注冊一個路徑地址和block回調對應

使用詳解:

 1.[[HHRouter shared] map:@"/user/:userId/"
         toControllerClass:[UserViewController class]];
 2.[[HHRouter shared] map:@"/user/:userId/story/"
         toControllerClass:[StoryListViewController class]];
 3. [[HHRouter shared] map:@"/story/:storyId/"
         toControllerClass:[StoryViewController class]];
  • [HHRouter shared]的單例中一個routes屬性的字典中維護了全局的url到controller或者block對應關系

  • 根據route返回一個嵌套的字典,鍵是pathCompanent,值是字典,字典的鍵是下一個pathCompanent,最后一個字典的鍵是"_",值是對應的controller或者block變量

調用1方法后routes里的保存情況

{"user":
              {":userId":
                                {
                                    "_":[UserViewController class]
                                  }
            }
}

調用2方法后routes里的保存情況

{"user":
              {":userId":
                                {
                                    "_":[UserViewController class]
                                    "story":
                                                  {
                                                        "_":[StoryListViewController class]
                                                  }
                                  }
            }
}

調用3方法后routes里的保存情況

{
  "user":
              {":userId":
                                {
                                    "_":[UserViewController class]
                                    "story":
                                                  {
                                                        "_":[StoryListViewController class]
                                                  }
                                  }
            }
  "story":
                {
                    " :storyId":
                                      {
                                            "_":[StoryViewController class]
                                      }

                }
}

2.返回對應的controller和block

-(UIViewController *)matchController:(NSString *)route;
-(HHRouterBlock)matchBlock:(NSString *)route;
  • route和url匹配邏輯

1. route中如果以":"開頭,將url中對應的pathComponent塞進params字典中作為傳參,校驗結果返回"YES"(found = YES),另外url中"?a=1&b=2"也會塞進params中

2. 不以":"開頭,只有url中對應的pathComponent與route中對應的pathComponent一致時,校驗結果才返回"YES"(found = YES)

for (NSString *key in subRoutesKeys) {
            if ([subRoutesKeys containsObject:pathComponent]) {
                found = YES;
                subRoutes = subRoutes[pathComponent];
                break;
            } else if ([key hasPrefix:@":"]) {
                found = YES;
                subRoutes = subRoutes[key];
                params[[key substringFromIndex:1]] = pathComponent;
                break;
            }
        }

  • params賦值

    • controller實現- (void)setParams:(NSDictionary *)paramsDictionary方法

    • block直接調用

-(id)callBlock:(NSString *)route
{
    NSDictionary *params = [self paramsInRoute:route];
    HHRouterBlock routerBlock = [params[@"block"] copy];

    if (routerBlock) {
        return routerBlock([params copy]);
    }
    return nil;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,947評論 18 139
  • 原文鏈接:https://github.com/halfrost/Halfrost-Field/blob/mast...
    hament閱讀 5,715評論 1 31
  • 前言 隨著用戶的需求越來越多,對App的用戶體驗也變的要求越來越高。為了更好的應對各種需求,開發人員從軟件工程的角...
    一縷殤流化隱半邊冰霜閱讀 87,450評論 214 1,098
  • 背景說明 通知相關的頁面跳轉POCT項目處于后臺狀態,服務器發推信息到客戶端,客戶端在通知欄點擊消息,進入App并...
    sycasl閱讀 1,341評論 0 1
  • iOS網絡架構討論梳理整理中。。。 其實如果沒有APIManager這一層是沒法使用delegate的,畢竟多個單...
    yhtang閱讀 5,252評論 1 23