【发布时间】:2021-11-07 02:08:08
【问题描述】:
我有一个从 Firebase 获取用户数据的闭包,在其中我有另一个从 Firebase 存储下载图像的闭包。
在用户登录之前,我需要能够从存储中下载图像。我想我会尝试一个 DispatchGroup(),但我无法将图像数据分配给 self.photoImage,它总是返回 nil。
self.photoImage = UIImage(data: data!)
这是我第一次使用 Storage 和 GroupDispatch(),因此我们将不胜感激。
相关代码:
class AppViewModel: ObservableObject {
private var db = Firestore.firestore()
@Published var userInfo: User?
@Published var signedIn: Bool = false
var handle: AuthStateDidChangeListenerHandle?
let authRef = Auth.auth()
var authHandle : AuthStateDidChangeListenerHandle?
var rootInfoCollection : CollectionReference!
var userIdRef = ""
var photoImage: UIImage?
var downloadImageTask: StorageReference?
var group = DispatchGroup()
func fetchUserData(){
db.collection("Users").document("\(userIdRef)").getDocument { [self] document, error in
// Check for error
if error == nil {
// Check that this document exists
if document != nil && document!.exists {
self.userInfo = document.map { (documentSnapshot) -> User in
let data = documentSnapshot.data()
let uid = data?["uid"] as? UUID ?? UUID()
let company = data?["company"] as? String ?? ""
let name = data?["name"] as? String ?? ""
let admin = data?["admin"] as? Bool ?? false
let photoRef = data?["photoRef"] as? String ?? ""
self.downloadImageTask = Storage.storage().reference().child(photoRef)
return User(uid: uid, company: company, name: name, admin: admin, photoRef: photoRef, photoImage: nil)
}
group.enter()
downloadImageTask?.getData(maxSize: 6 * 1024 * 1024) { data, error in
if let error = error {
print("Got an error fetching data: \(error.localizedDescription)")
return
} else {
self.photoImage = UIImage(data: data!)
}
self.group.leave()
}
DispatchQueue.global(qos: .default).async {
self.group.wait()
DispatchQueue.main.async {
if photoImage != nil {
print("Photo Image Is Set")
}
withAnimation {
self.signedIn = true
}
}
}
}
}
}
}
【问题讨论】:
-
你的 DispatchGroup 的整个结构是错误的,无论如何这不是 DispatchGroup 合适或需要的情况。
-
我建议你去读一些关于 GCD 的东西,Ray Wenderlich 的教程很不错raywenderlich.com/…
标签: swift firebase firebase-storage