美文网首页
iOS 使用 runtime 替换 viewWillAppear

iOS 使用 runtime 替换 viewWillAppear

作者: 小白e7899 | 来源:发表于2019-11-08 11:48 被阅读0次

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

    }


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

    相关文章

      网友评论

          本文标题:iOS 使用 runtime 替换 viewWillAppear

          本文链接:https://www.haomeiwen.com/subject/vmribctx.html