从远程服务器在 init 方法中填充 tableview 数据源
populating tableview datasource inside init method from remote server
我有一个 tabBarView,它有两个 tableViews
。这些 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 数组被填充之前,方法 tableView:numberOfRowsInSection
被调用,所以我的 tableView
没有填充任何新闻。我该如何解决这个问题?
谢谢
从服务器获取数据后,您应该重新加载 table 数据。那么只有您的 table 会显示更新后的数据。
[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];
});
我有一个 tabBarView,它有两个 tableViews
。这些 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 数组被填充之前,方法 tableView:numberOfRowsInSection
被调用,所以我的 tableView
没有填充任何新闻。我该如何解决这个问题?
谢谢
从服务器获取数据后,您应该重新加载 table 数据。那么只有您的 table 会显示更新后的数据。
[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];
});