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

标签 ios objective-c uitableview objective-c-blocks

我有一个 tabBarView,它有两个 tableViews。这些 tableViews 中的每一个都代表来自远程服务器的一些新闻。我想在调用 tableViewController 的 init 方法时填充 tableView 的 数据源。所以我将所需的网络操作放在 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 的 方法的调用顺序如下所示:

  • tableViewController 的 init 方法被调用并完成(但尚未调用完成处理程序 block )

  • tableViewController的 viewDidLoad 方法被调用(当tableViewController被添加到tabBarView的时被调用viewControllers 数组)

  • tableViewController 的 委托(delegate)方法tableView:numberOfRowsInSection 被调用
  • 调用网络操作的completionHandler block 并将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];
  });

关于ios - 从远程服务器在 init 方法中填充 tableview 数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32474301/

相关文章:

ios - 带有 UISearchBar 作为标题 View 的 UITableView 导致崩溃

ios - Swift 使协议(protocol)扩展成为通知观察者

c - #define 指令问题

ios - 如何获取navigationItem的backBarButtonItem方法?

ios - 资源目录中字体资源的定义是什么?

ios - 根据手机方向更改 UITableViews

ios - iTunes Connect-删除应用

ios - 在 UITableviewCell 上滑动手势就像 Whatsapp 为 "Reply a Message"所做的那样

ios - 使用 getter/setter 的正确方法是什么

ios - 如何自行调整单元格大小?