从远程服务器在init方法中填充tableview数据源



我有一个有两个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];
  });

最新更新