Swift:线程化|调度队列
因此,我有一个应用程序可以连接到一个简单的firebase数据库,当用户登录该应用程序时,该数据库可以将用户连接到他们的个人资料。每个用户都有一个用户名、个人资料图片和其他与应用程序相关的数据,这些数据存储在他们自己的用户ID中。我的主要问题是,当应用程序试图从数据库检索信息时,我的UI变得无响应,例如,如果我想按下主页中的某个对象(无论是按钮、表视图等)要将我带到另一个视图控制器,需要大约5秒钟,如果用户的wifi连接不好,有时甚至更糟 我尝试过做一些事情,比如运行代码,将数据检索到具有.background DispatchQoS的dispatchQueue上,认为它将在后台线程上运行,允许用户在不必等待数据加载的情况下自由使用UI,但这似乎对我不起作用 任何帮助都将不胜感激Swift:线程化|调度队列,swift,xcode,multithreading,Swift,Xcode,Multithreading,因此,我有一个应用程序可以连接到一个简单的firebase数据库,当用户登录该应用程序时,该数据库可以将用户连接到他们的个人资料。每个用户都有一个用户名、个人资料图片和其他与应用程序相关的数据,这些数据存储在他们自己的用户ID中。我的主要问题是,当应用程序试图从数据库检索信息时,我的UI变得无响应,例如,如果我想按下主页中的某个对象(无论是按钮、表视图等)要将我带到另一个视图控制器,需要大约5秒钟,如果用户的wifi连接不好,有时甚至更糟 我尝试过做一些事情,比如运行代码,将数据检索到具有.ba
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")
}
}