在 viewDidLoad 之前延迟表视图加载或加载数组?

Posted

技术标签:

【中文标题】在 viewDidLoad 之前延迟表视图加载或加载数组?【英文标题】:Delay table view loading or load array before viewDidLoad? 【发布时间】:2014-07-05 17:27:44 【问题描述】:

我正在使用网络服务来填充一组项目,然后用这些项目填充我的表格视图的单元格。

现在我遇到了表格视图本身的问题。当我检查“numberofrows”方法时,数组还没有加载。出于某种原因,它会在“之后”加载(根据我的 nslogs 和断点),即使我已经尽可能早地将每个加载方法放在该控制器中。

现在我不知道的是:

有没有办法延迟表视图的创建,所以我确定我的数组已加载? 有没有办法提前加载我的阵列?这是我在 viewDidLoad 中的第一行。 (调用另一个类,然后调用 webservice 并返回一个数组,但此时表格视图已经加载并为空)。

我尝试过:放置一个 tableview reloadData。但这根本行不通。由于某种原因,编译器读取了该行,但没有加载任何新内容,即使此时数组已满。

我错过了什么吗?

(如果我将硬编码的对象放入数组中,我的 tableview 就可以正常工作)

我可以编辑和添加一些你们会要求的代码,但由于这看起来像是学校的问题,也许我只是忘记了一些东西。

伙计们,我全神贯注! 编辑:

我的不同方法;我已经删除了不必要的代码以便更清晰地阅读。 编译器永远不会进入 cellForRow,因为 numberOfRows 返回一个零数字。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *cellIdentifier = @"CustomCellTableViewCell";
    CustomCellTableViewCell *cell = [self.tbUpcomingEvents dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];


    cell.lbTitle = [_eventList objectAtIndex:indexPath.row];

    return cell;

行数; nslog 返回零。

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    NSLog(@"numOfRows : %i", [_eventList count]);
    return [_eventList count];

我的webservice方法,这是从“webservice类”中调用来加载数据的方法。 在这里,NSLog 显示了一个完整的数组。

- (void)loadData:(NSMutableArray*)arrayEvent

//arrayEvent is full from the internet data. eventList is also full on the NSLog.
    _eventList = arrayEvent;
    NSLog(@"LoadData : %i", [_eventList count]);
    [self.tbUpcomingEvents reloadData];

我的 viewdidLoad 方法

- (void)viewDidLoad

    [super viewDidLoad];

    //Calling my UseCaseController to load the data from the internet.
    UCC *sharedUCC = [UCC sharedUCC];
    [sharedUCC getUserEventsInDbDis:self :_user];


【问题讨论】:

请同时显示调用 reload tableview、numberOfRowsInSection、numberOfSections 和 cellForRow 方法的代码 我已根据您的要求进行了编辑! numberOfSections 只是默认的 1,所以我没有办法。 加载数据和 numberOfRows 中的断点。在 loadData 之后会调用 numberOfRows 吗?在加载数据中注销self.tbUpcomingEvent 以确保其不为零。注销self.tbUpcomingEvents.delegate 以确保它也已设置。 numberOfRows 确实是首先被调用的。好吧,我猜这个问题放大了。在我的加载数据中,表格视图和委托正在记录(空)。我不知道为什么,如果我发送硬编码数据,一切都已连接,并且 tableview 工作正常。 它是否在 View 中注销为 null 是否加载? 【参考方案1】:

正如您所说,您正在使用网络服务。所以它在块中执行你的代码,这意味着它在单独的线程中运行。现在根据苹果文档 UI 更新应该发生在主线程中。因此,对于表创建,您需要在下面的 GCD 代码中包含相同的内容:-

 dispatch_async(dispatch_get_main_queue,()^

    // write your code for table creation here
  );

【讨论】:

虽然这个答案可能是正确的,但在你知道它是一个答案之前,不要随便吐出答案。许多其他事情可能是错误的。我们不应该对解决方案进行随机猜测,而是花时间确保我们理解问题。 我从未使用过这样的代码,但您的行似乎很简单。我只需要了解这一点就可以尝试一下:GCD 代码是什么? Grand Central Dispatch 是我相信 NSThread 的包装器。它用于线程操作。大多数 API 调用都是在后台线程上完成的。上面的这个方法将确保块中的操作在主线程上运行。许多 UI 操作必须在主线程上完成。

以上是关于在 viewDidLoad 之前延迟表视图加载或加载数组?的主要内容,如果未能解决你的问题,请参考以下文章

在加载视图之前从 iCloud 加载文档

延迟切换uiviews

iOS 8 viewDidLoad 模态演示导致多个演示

有没有办法在重新加载表格视图数据之前添加加载视图

通过下拉刷新逐一获取行,想要在 viewdidload 上的整个数组

在 viewDidAppear 之前无法正确设置框架