【问题标题】:Main thread continue without background thread [duplicate]主线程继续没有后台线程[重复]
【发布时间】:2019-07-22 07:05:59
【问题描述】:

我正在尝试编写一个函数来从 firebase 获取数据并更新一个全局变量(分支),我知道后台线程对此负责,因此即使后台线程尚未完成,主线程也可以继续,但我不想那样。如何强制主线程等到全局变量更新?

这里是函数:

func getID(email: String){
    databaseRef = Database.database().reference()
    databaseRef.root.child("Branches").observe(.value, with: { (snapshot) in
        if ((snapshot.children.allObjects as? [DataSnapshot]) != nil) {
            let child = snapshot.value as! [String: [String : String]]
            for (key, data) in child{
                for (k, d) in data{
                    if k == "Email" && d == email {
                        self.branch = key
                    }
                }
            }
        }
    })
}

【问题讨论】:

  • 为后台任务保留主线程不是一个好习惯。您可以在后台任务完成后使用转义闭包进行通知。
  • stackoverflow.com/q/54322884stackoverflow.com/a/49579711stackoverflow.com/q/41628089more from thesestackoverflow.com/a/27345823。最后一个展示了如何完成您的要求,但正如其他人已经评论和回答的那样,您最好学习如何处理异步行为,因为这在使用现代基于云的 API 时非常常见。
  • 我和@FrankvanPuffelen 在一起。但是,您的问题中显示的功能可能会在不到一秒钟的时间内发生......或者可能不会。我怀疑您正在数据中寻找某些东西——也许查询会比循环更好的解决方案,因为它会返回特定的数据片段。用例是什么?

标签: swift multithreading firebase firebase-realtime-database


【解决方案1】:

我假设我们谈论的是 iOS,所以: 无响应是对所谓的“用户体验”所能做的最糟糕的事情——等待一些网络资源肯定是不可预测的。如果你阻塞主线程的时间太长(比如:30 秒),iOS 操作系统会杀死你的应用程序。在此之前,用户通常会退出您的应用程序并且永远不会再次启动它,而是将其从设备中删除。

我建议改用进度指示器和信息性消息,并在应用程序等待数据时调暗(禁用等)所有用户控件。甚至可能有一个取消按钮。

【讨论】:

    猜你喜欢
    • 2021-05-18
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    相关资源
    最近更新 更多