Swift:线程化|调度队列

Swift:线程化|调度队列,swift,xcode,multithreading,Swift,Xcode,Multithreading,因此,我有一个应用程序可以连接到一个简单的firebase数据库,当用户登录该应用程序时,该数据库可以将用户连接到他们的个人资料。每个用户都有一个用户名、个人资料图片和其他与应用程序相关的数据,这些数据存储在他们自己的用户ID中。我的主要问题是,当应用程序试图从数据库检索信息时,我的UI变得无响应,例如,如果我想按下主页中的某个对象(无论是按钮、表视图等)要将我带到另一个视图控制器,需要大约5秒钟,如果用户的wifi连接不好,有时甚至更糟 我尝试过做一些事情,比如运行代码,将数据检索到具有.ba

因此,我有一个应用程序可以连接到一个简单的firebase数据库,当用户登录该应用程序时,该数据库可以将用户连接到他们的个人资料。每个用户都有一个用户名、个人资料图片和其他与应用程序相关的数据,这些数据存储在他们自己的用户ID中。我的主要问题是,当应用程序试图从数据库检索信息时,我的UI变得无响应,例如,如果我想按下主页中的某个对象(无论是按钮、表视图等)要将我带到另一个视图控制器,需要大约5秒钟,如果用户的wifi连接不好,有时甚至更糟

我尝试过做一些事情,比如运行代码,将数据检索到具有.background DispatchQoS的dispatchQueue上,认为它将在后台线程上运行,允许用户在不必等待数据加载的情况下自由使用UI,但这似乎对我不起作用

任何帮助都将不胜感激

override func viewDidLoad() {
    super.viewDidLoad()
    
    let dispatchQueue = DispatchQueue(label: "QueueIdentification", qos: .background)
   
    _ = Auth.auth().addStateDidChangeListener { (auth, user) in
            if user != nil {
                //There is a user
                self.usernameLabel.text = user?.displayName ?? "Edit Name"
                
                // Get the user profile picture from storage
                let storage = Storage.storage()
                let storageRef = storage.reference()
                let profilePicRef = storageRef.child("ProfileImages/\(Auth.auth().currentUser!.uid).jpg")
                
                dispatchQueue.async {
                    
                    profilePicRef.downloadURL { (url, error) in
                        guard let downloadURL = url else {
                            // Error occured
                            return
                        }
                        // Now we set the image using the downloadURL
                        let imageData = try! Data(contentsOf: downloadURL)
                        let image = UIImage(data: imageData)
                        self.profilePictureImageView.image = image
                    }
                    
                }
                    
            } else {
                //There is no user, go to sign in page
                self.performSegue(withIdentifier: "toSignIn", sender: self)
            }
         
        
        
    }
    
    setUpUI()

}

如果要从后台线程检索数据,则需要在主线程中进行UI更改。否则,该应用程序将freez

DispatchQueue.global(qos: .background).async {
    print("This is run on the background queue")

    DispatchQueue.main.async {
        print("This is run on the main queue, Do the UI changes here")
    }
} 

你能显示相关代码吗?刚刚添加了我的viewDidLoad的代码。我在获得用户后执行调度队列,尽管wifi连接速度相对较快,但获取和设置profilePic.downloadURL需要一段时间(这是我想要放置调度队列的地方),实际上我刚刚让它工作!张贴我的答案!
DispatchQueue.global(qos: .background).async {
    print("This is run on the background queue")

    DispatchQueue.main.async {
        print("This is run on the main queue, Do the UI changes here")
    }
}