【问题标题】:Simple waiting for value from async thread简单地等待来自异步线程的值
【发布时间】:2016-07-09 12:24:33
【问题描述】:

我有 2 个基本方法 - viewDidLoadviewDidAppear。根据我的 App 理念,当视图控制器加载时,它会从基础中获取数据并开始使用一些谓词对其进行排序。获取过程很长,所以我将它分派到全局队列。当我的视图出现时,它显然没有从数组中获取值(在加载方法中编译)并崩溃。所以我需要viewDidAppear 等到至少一个对象被附加到数组中。 信号量或温度值的种类? 提前致谢!

附:数组中的每个项目都表示具有构成 UI 的数据的结构。用户与此 UI 交互,因此必须使用数组中的第一项加载一次。要切换到下一项,用户只需单击“下一项”,UI 会根据数组中的下一项进行更改。这就是为什么我希望数据在后台获取并允许用户立即工作。 (不可能立即跳转到第 5、10 或 1001 个元素,在用户进入这些页码之前会有足够的时间获取数据)

P.P.S 仍然没有正确的决定:(

【问题讨论】:

  • 告诉,不要问。使用异步完成块并在完成块中设置数据数组/重新加载表视图。
  • @vadian 不幸的是,它会“冻结”界面并长时间加载“进度条”。
  • 您的 UI 不应依赖于获取的数据。想象一下,Internet 连接将不可用。即使在这种情况下,您的 UI 也应该是响应式的。在真实数据可用之前显示一些占位符或空数据。
  • @user3441734 是的,我理解正确,但我想在加载几个数据后使其处于活动状态。如果没有数据(没有连接)它只会告诉用户它

标签: swift uiviewcontroller grand-central-dispatch viewdidload viewdidappear


【解决方案1】:

您应该使用嵌套的调度块,如下所示:

func fetch(completion block:(() -> Void)?) {
    // Run fetch on background thread, to prevent the main thread (and hence your UI) from being 'blocked'.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {

        //
        // Fetch data...
        //

        dispatch_async(dispatch_get_main_queue(), {
            block?()
        })
    })
}

fetch(completion: {
    // Update your UI
})

【讨论】:

  • 是的,我想过,但据我了解,它会在每个项目之后更新 UI,附加到数组中。我在数组中平均有 3000-5000 个项目。在 1 秒内可以获取 5-10 个项目,所以我会看到 5-10 个 UI 更新?实际上,每个项目都代表带有数据的结构。我用来自项目结构的数据组成了整个 UI。用户可以与这些数据进行交互:写一些文本,点击一些触发器,所以如果 UI 被刷新,用户可以放松一些工作流程。
  • 在这种情况下,您有一个选择:您可以先获取所有数据(这可能需要相当长的时间),或者您可以“逐步”加载 UI。我的意思是说你有 1000 个项目,每个项目都取决于你获取的数据。您应该加载一个“临时”视图在其位置。然后,当数据被提取后,您将 actual 视图加载到它的位置。这样,用户可以与依赖于已获取数据的 UI 组件进行交互,而其他组件仍在加载。希望这会有所帮助!
  • 这似乎是最简单的方法,但由于某些原因,等待可能持续太久,用户只会坐下来查看进度条。这就是问题所在,我希望用户立即开始工作
  • 是的,我明白了,我推荐后一种选择:逐步加载 UI。例如,查看 Facebook 移动应用程序中的新提要。 UI 会显示已获取的帖子,但如果您向下滚动的速度足够快,您会看到仍在等待获取/检索数据的 UI 的“占位符”。
  • 好的,我有一个包含多个 UILabel 和 UIImageViews 的视图。在获取我的数据之前,我会将它们留空吗?通过单击“下一步”,UI 仅使用新标签文本和图像进行更改,因此我看不到任何明显的占位符位置。 Facebook 使用连续滚动,它加载的数据远低于互联网速度,您甚至可能看不到这些占位符
猜你喜欢
  • 2018-10-01
  • 2020-07-08
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多