需求:因为服务器停机维护这其他问题,需要停机维护,如果用户打开app网络请求会报错,这个时候就展示给用户一个停机维护的界面,告诉用户停机维护大约持续多少时间
此处省略界面(根据需求定制),
逻辑:每个页面都需要判断,如果有维护更新,直接切换app根控制器
方法之一:最简单(笨)的方法
在所有的VC的viewWillAppear方法中添加代码,但是代码大量重复,难以维护
方法之二:继承
在基类VC的viewWillAppear方法中添加代码,可以省点继承基类的代码,但是基类是继承自UIViewController,但是如果是UITableviewController、UITabBarController等呢?
只是相当于第一种方法,第二种方法算是有进步了。
方法三:Category 类目
增加一个UIViewController的category,封装一个替换控制器的方法,结合第二种方法,继承自基类的VC,直接写在基类,其他类型的VC在viewWillAppear调用封装的方法。
相对于前面2种方法,第三种方法更先进。
方法四:使用runtime;
思路:在第三种方法中,写一个自己的方法比如myViewWillAppear, 在load方法中运用runtime做方法交换
Method systemViewWillAppear = class_getInstanceMethod(self, @selector(viewWillAppear:));
Method myViewWillAppear = class_getInstanceMethod(self, @selector(myViewWillAppear:));
method_exchangeImplementations(systemViewWillAppear, myViewWillAppear);
- (void)myViewWillAppear:(BOOL)animated {
NSLog(@"%@",NSStringFromSelector(_cmd));
[self myViewWillAppear:animated];
[self isStopSerce]; // 判断是否需要停机维护,如需要停机维护,就切换根视图
}
个人觉得方法四是最优选择,但是在我实现过程中,方法确实交换了,但是执行 [self isStopSerce] ,就出现死循环,
- (BOOL)isUpgrade {
// 判断是否有停机维护
NSURL*url = [NSURL URLWithString:maintenance_url];
NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSDictionary *dic = [XBUtils jsonStringTodictionary:str];
DgsnUpgrade *model = [Upgrade yy_modelWithDictionary:dic];
if(model.status.integerValue==1) {
[app maintenanceCtrl:model];
returnYES;
}
return NO;
}
因为项目进度比较赶,目前采用方法三,有人碰到相同问题吗,欢迎交流。
网友评论