【问题标题】:populating tableview datasource inside init method from remote server从远程服务器在 init 方法中填充 tableview 数据源
【发布时间】:2015-09-09 08:11:55
【问题描述】:

我有一个 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'sviewDidLoad方法(tableViewController添加到tabBarView'sviewControllers数组时调用)

  • tableViewController's委托方法tableView:numberOfRowsInSection被调用
  • 网络操作的completionHandler 块被调用,newsList 数组被设置为从服务器检索到的新闻

所以我的问题是,在填充我的 newsList 数组之前,方法 tableView:numberOfRowsInSection 被调用,所以我的 tableView 没有填充任何新闻。我应该如何解决这个问题?

谢谢

【问题讨论】:

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


    【解决方案1】:

    您应该在从服务器获取数据后重新加载表数据。那么只有您的表格会显示更新的数据。

    [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];
      });
    

    【讨论】:

      猜你喜欢
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      相关资源
      最近更新 更多