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;
}