项目常见问题(一)

今天做项目的时候发现了一个奇葩问题, 连续请求了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里加载数据, 这样第一次点击的时候也不会有问题了.

你可能感兴趣的:(项目常见问题(一))