结论: 类的load方法的调用发生在app main函数之前。
特点: 当类被引用进项目的时候就会执行 load 函数(在 main 函数开始执行之前),与这个类是否被用到无关,每个类的 load 函数只会自动调用一次。
之前也去了解路由的概念,但是一直拖着没去认真学习,没去实践。因为一直觉得陌生不知怎么下手。我知道大的项目以及组件化开发离不了路由实现。路由是一项重要的技能。我决定花一段时间去研究它、demo中实现它。一定要学会路由。并能很熟练的应用。一口吃不一个胖子,要有耐心,从易到难。先学习一个简单的例子。这是蘑菇街的一个路由的方法。只是觉得MGJRouter简单。其原理主要是通过注册URL来实现路由跳转。
背景
因为app中有大量与H5之间的交互,原生和H5的跳转操作比较多比较频繁,新增一个跳转又涉及到改代码发版本,为了统一iOS、安卓和H5的跳转,引入了路由。Router就像是个调度中心,各个模块通过路由调度其他模块,模块之间不需要相互引用,调度方式更加统一,更加自由,能够实现解耦的作用,同时也为之后的组件化开发提供了基础。
MGJRouter
使用
主要有两个步骤:
- 注册URL生成路由表。
- openUrl实现跳转。
下面是一个简单的使用demo:
一、我们创建一个类GlobalModuleRouter,然后在+(void)load方法里面统一注册url
#import <Foundation/Foundation.h>
@interface GlobalModuleRouter : NSObject
@end
#import "GlobalModuleRouter.h"
#import "MGJRouter.h"
#import "TestViewController1.h"
#import "TestViewController2.h"
#import "TestViewController3.h"
@implementation GlobalModuleRouter
// 在load方法中自动注册,在主工程中不用写任何代码。
+ (void)load {
[MGJRouter registerURLPattern:@"LWT://Test1/PushMainVC" toHandler:^(NSDictionary *routerParameters) {
UINavigationController *navigationVC = routerParameters[MGJRouterParameterUserInfo][@"navigationVC"];
TestViewController1 *vc = [[TestViewController1 alloc] init];
[navigationVC pushViewController:vc animated:YES];
}];
[MGJRouter registerURLPattern:@"LWT://Test2/PushMainVC" toHandler:^(NSDictionary *routerParameters) {
UINavigationController *navigationVC = routerParameters[MGJRouterParameterUserInfo][@"navigationVC"];
NSString *labelText = routerParameters[MGJRouterParameterUserInfo][@"text"];
TestViewController2 *vc = [[TestViewController2 alloc] init];
vc.labelText = labelText;
[navigationVC pushViewController:vc animated:YES];
}];
[MGJRouter registerURLPattern:@"LWT://Test3/PushMainVC" toHandler:^(NSDictionary *routerParameters) {
UINavigationController *navigationVC = routerParameters[MGJRouterParameterUserInfo][@"navigationVC"];
void(^block)(NSString *) = routerParameters[MGJRouterParameterUserInfo][@"block"];
TestViewController3 *vc = [[TestViewController3 alloc] init];
vc.clicked = block;
[navigationVC pushViewController:vc animated:YES];
}];
[MGJRouter registerURLPattern:@"LWT://Test2/getMainVC" toObjectHandler:^id(NSDictionary *routerParameters) {
NSString *labelText = routerParameters[MGJRouterParameterUserInfo][@"text"];
TestViewController2 *vc = [[TestViewController2 alloc] init];
vc.labelText = labelText;
return vc;
}];
}
@end
二、调用:
#import "ViewController.h"
#import "MGJRouter.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (IBAction)pushTest1ModuleAction:(id)sender {
[MGJRouter openURL:@"LWT://Test1/PushMainVC"
withUserInfo:@{@"navigationVC" : self.navigationController,
}
completion:nil];
}
- (IBAction)pushTest2ModuleAction:(id)sender {
[MGJRouter openURL:@"LWT://Test2/PushMainVC"
withUserInfo:@{@"navigationVC" : self.navigationController,
@"text": @"爱就像蓝天白云晴空万里",
}
completion:nil];
}
- (IBAction)pushTest3ModuleAction:(id)sender {
[MGJRouter openURL:@"LWT://Test3/PushMainVC"
withUserInfo:@{@"navigationVC" : self.navigationController,
@"block":^(NSString * text){
NSLog(@"%@",text);
},
}
completion:nil];
}
- (IBAction)objectTestAction:(id)sender {
[self.navigationController pushViewController:[MGJRouter objectForURL:@"LWT://Test2/getMainVC" withUserInfo:@{@"text" : @"我知道我对你不仅仅是喜欢",}] animated:YES];
}
对应下列四种情景:
pod ‘MGJRouter’, ‘~>0.9.0’
MGJRouter_Swift版本
http://www.pianshen.com/article/4692189680/
参考
转载:https://blog.csdn.net/shifang07/article/details/101033028
查看评论