我有一个有两个tableViews
的tabBarView。每个tableViews
将表示来自远程服务器的一些新闻。当tableViewController's
init
方法被调用时,我想填充tableView's
数据源。因此,我将所需的网络操作放在init
方法中。我的init
方法是:
- (instancetype) init{
self = [super init];
[NewsManager fetch:10 remoteNewsOfLanguage:@"fa" withOffsett:1 andCompletionHandler:^(NSMutableArray *news) {
self.newsList = news;
}];
self.tabBarItem.title = @"my title";
return self;
}
newsList是一个保存从服务器加载的新闻的数组。
但是当我运行我的项目时,tableViewController's
方法的调用顺序如下:
tableViewController's init
方法被调用并完成(但尚未调用完成处理程序块)tableViewController's
viewDidLoad
方法被调用(当tableViewController
被添加到tabBarView's
viewControllers
数组时调用)-
tableViewController's
委托方法tableView:numberOfRowsInSection
被调用 - 网络操作的
completionHandler
块被调用,newsList数组被设置为从服务器 检索到的新闻。
所以我的问题是,在我的newsList数组填充之前,方法tableView:numberOfRowsInSection
被调用,所以我的tableView
没有填充任何新闻。我该如何解决这个问题?
谢谢
从服务器获取数据后应该重新加载表数据。那么只有您的表将显示更新的数据。
[NewsManager fetch:10 remoteNewsOfLanguage:@"fa" withOffsett:1 andCompletionHandler:^(NSMutableArray *news) {
self.newsList = news;
[yourTableview reloadData];//add this line
}];
添加的行完成任务并使新数据加载到tableView中但我认为有一点需要考虑
[tableView reloadData]
将在mainThread以外的线程中执行,这将导致数据加载到tableView上的5到10秒延迟。
为了防止这种情况,你应该告诉它在主线程上运行reloadData方法。这是通过dispatch_async完成的。所以你应该像这样调用[tableView reloadData]:
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});