iOS 使用 runtime 替换 viewWillAppear 出现死循环

需求:因为服务器停机维护这其他问题,需要停机维护,如果用户打开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;

}


因为项目进度比较赶,目前采用方法三,有人碰到相同问题吗,欢迎交流。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容