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