项目常见问题(一)

今天做项目的时候发现了一个奇葩问题, 连续请求了2次网络,连续请求网络可能造成很多问题, 浪费流量, 数据不同步, 有时候甚至不能正常工作等等.

问题重现.

我希望在点击tabbar的时候刷新一次数据
实现

- (void)initRootViewControllerData {
// do some request
}

调用

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
{
    dispatch_async(dispatch_get_main_queue(), ^{
        MFNavigationViewController *currentNav = self.selectedViewController;
        UIViewController *curentRootVc = [currentNav.viewControllers firstObject];
        if ([curentRootVc respondsToSelector:@selector(initRootViewControllerData)]) {
            [curentRootVc performSelector:@selector(initRootViewControllerData)];
        }
    });
}

通过运行时去调用, 这里就可能存在这样的问题, 方法调用的时候VC还没执行viewDidLoad, 原因就是点击的时候当前被点击的VC没有add进来, 所以将会先执行initRootViewControllerData再执行viewDidLoad, 所以这时候请求数据是没有太多意义的, 至少你要把请求的数据保存下来才可以后续使用. 但为了不破坏原来代码的结构, 还是想在viewDidLoad时才去加载数据, 就需要用到isViewLoaded这个属性, 这个属性在viewDidLoad执行前会返回NO, 所以我们在initRootViewControllerData加上这样的判断就可以了.

- (void)initRootViewControllerData {
    if (!self.isViewLoaded) {
        return;
    }
// do some request
}

如果view没加载就不load数据, 会在viewDidLoad里加载数据, 这样第一次点击的时候也不会有问题了.

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,923评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,269评论 25 708
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,364评论 0 6
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,252评论 1 23
  • 迷迷糊糊中把你的片子看完了,凌晨4點,卻清醒了~ 不知道你在拍片製作時是什麼樣的心情,能拍出這樣片子的那個人又需要...
    NCNeverland阅读 157评论 0 0