iphone - 如何防止应用程序在下载数据时被阻止[关闭]

Posted

技术标签:

【中文标题】iphone - 如何防止应用程序在下载数据时被阻止[关闭]【英文标题】:iphone - How to prevent app to block while downloading data [closed] 【发布时间】:2012-03-01 16:16:21 【问题描述】:

我正在使用 XMPPframework 开发应用程序。当我下载用户的电子名片(图片、姓名等)时,应用程序会阻塞,直到它下载了当时所有连接的人的数据。

我需要将它放在第二个线程中(我还没有使用多线程),以便应用程序响应新的触摸并在下载数据时显示一个活动图标。

我听说过 Grand Central Dispatch (GCD),但我也听说过其他方式,您会推荐哪种方式?

谢谢。

【问题讨论】:

我想说,如果您是从头开始编写,那么除了 GCD 之外,没有理由使用其他任何东西。它与网络上的许多示例很好地集成在一起。 【参考方案1】:

你可以用这样的东西在第二个线程上工作。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
  /* your code to download the vCards goes here */
  /* if you are explicitly updating a UI element then you would have to perform that on the main thread so you would do something like this */
  dispatch_async(dispatch_get_main_queue(), ^
     label.text = @"some text";  // or any other code that updates a UI element
  );
);

如果您只想在第二个线程中下载 vCard 数据并将结果分配给变量,则无需第二次调用 dispatch_async(),因为您没有对 UI 元素执行任何操作。

【讨论】:

让我看看,所以你是说第一个块将下载数据但不显示它,当所有数据下载完毕后,我将执行代码以显示第二个块的图片,对吗? 这取决于您的代码如何编写以显示您下载的内容。如果您正在显式进行更新 UI 的调用,例如更新标签的文本或类似的内容,那么您必须在第一个 dispatch_async 中放置第二个 dispatch_async,并将您的代码放入其中以更新 UI。我将编辑我的答案以尝试使其更清晰。

以上是关于iphone - 如何防止应用程序在下载数据时被阻止[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Swift:如何防止未显示的 UITableViewCells 在滚动时被关闭

如何防止我的 iPhone 应用程序在 iPad 上下载? [复制]

防止 Django SQLite db 在推送到 Heroku 时被覆盖

WiX:如何防止注册表值在卸载时被删除?

防止程序在启动时被 Windows 克隆

如何使用 EntityFramework 4.1 CodeFirst 防止十进制值在保存时被截断为 2 位? [复制]