iOS:在填充表格视图之前等待异步方法

Posted

技术标签:

【中文标题】iOS:在填充表格视图之前等待异步方法【英文标题】:iOS: Wait for asynchronous method before populating a tableview 【发布时间】:2014-03-11 17:37:16 【问题描述】:

我正在从我的服务器获取一些数据,这些数据需要用作创建表格视图的元数据。问题是数据加载与应用程序的流程异步。我确信这可能是一个简单的修复,但我如何才能暂停应用程序的流程,直到从服务器加载数据,或者在数据可用时更新表格视图?

谢谢!

【问题讨论】:

【参考方案1】:

您可以使用 UIActivityIndi​​catorView 来显示正在下载的数据。以异步模式下载数据后,您可以重新加载 UITableView。

UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] 
                                       initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    spinner.center = CGPointMake(100, 100);
    spinner.hidesWhenStopped = YES;
    [self.view addSubview:spinner];
    [spinner startAnimating];

现在调用从网络下载数据的方法。

[self asyncDownloadMethod];

当您收到通知(即任何代表已下载内容)时,停止指示器。

[spinner stopAnimating];

希望这会有所帮助。

【讨论】:

【参考方案2】:

首先,确保你的数据源方法写得正确,这样如果还没有数据,表确实是空的。这是因为数据源方法会在表格第一次出现时被调用,也就是在你有数据之前。

然后,当有 数据时,只需调用reloadData(在主线程上!)。相同的数据源方法将再次运行,但这次有数据。

【讨论】:

很高兴为您提供帮助。正如另一个答案已经指出的那样,您可以通过活动视图或类似的方式在心理上(对于用户)来掩盖延迟。您甚至可能想暂时关闭用户交互以强制用户耐心等待,但不要这样做太久,否则您会被看门狗进程杀死。【参考方案3】:

您没有提供足够的信息来明确回答,但要点是您需要设置一个 delegate,以便在您完成加载数据后处理填充表格视图。

例如,NSURLConnection 类定义了connectionWithRequest:delegate: 选择器用于异步加载数据。 delegate 参数定义为:

委托 连接的委托对象。随着加载的进行,连接会调用此委托上的方法。委托方法在调用此方法的同一线程上调用。为使连接正常工作,调用线程的运行循环必须在默认运行循环模式下运行。

【讨论】:

以上是关于iOS:在填充表格视图之前等待异步方法的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中等待多个网络异步调用

IOS:用表格视图填充弹出框

Tableview 行显示槽加载视图

PCL中的MVVMCross异步和等待方法

iOS todo-tutorial,无法重新填充表格视图

填充 UITableView 的更快方法?