【发布时间】:2019-01-22 10:50:38
【问题描述】:
我正在我的应用程序(使用 TwitterKit)上实现使用 Twitter 选项登录,但它在下面的函数上不断崩溃 - saveUserIntoFirebaseDatabase(将用户数据、图像上传到 Firebase 数据库时)。我不明白为什么下面的函数需要在主队列中?
用户数据被提取并保存到 Firebase Auth 部分,但是在尝试将用户数据保存到实时数据库和存储时似乎崩溃了?
fileprivate func saveUserIntoFirebaseDatabase() {
guard let uid = Auth.auth().currentUser?.uid,
let name = self.name,
let username = self.username,
let email = self.email,
let profileImage = profileImage,
let profileImageUploadData = UIImageJPEGRepresentation(profileImage, 0.3) else { Service.dismissHud(self.hud, text: "Error", detailText: "Failed to save user.", delay: 3); return }
let filename = UUID().uuidString
let storageRef = Storage.storage().reference().child("profile_images").child(filename)
storageRef.putData(profileImageUploadData, metadata: nil, completion: { (metadata, err) in
if let err = err {
Service.dismissHud(self.hud, text: "Error", detailText: "Failed to save user with error: \(err)", delay: 3);
return
}
// Firebase 5 Update: Must now retrieve downloadURL
storageRef.downloadURL(completion: { (downloadURL, err) in
guard let profileImageUrl = downloadURL?.absoluteString else { return }
print("Successfully uploaded profile image into Firebase storage with URL:")
let dictionaryValues = ["name": name,
"email": email,
"username": username,
"profileImageUrl": profileImageUrl]
let values = [uid : dictionaryValues]
Database.database().reference().child("users").updateChildValues(values, withCompletionBlock: { (err, ref) in
if let err = err {
Service.dismissHud(self.hud, text: "Error", detailText: "Failed to save user info with error: \(err)", delay: 3)
return
}
print("Successfully saved user info into Firebase database")
// after successfull save dismiss the welcome view controller
self.hud.dismiss(animated: true)
self.dismiss(animated: true, completion: nil)
})
})
})
}
我设置的 MainTabBarController 有以下内容来查看当前用户是否已登录,如果没有,他们将被重定向到 Welcome Controller。会不会是这个原因?
fileprivate func checkLoggedInUserStatus() {
if Auth.auth().currentUser == nil {
DispatchQueue.main.async {
let welcomeController = WelcomeController()
let welcomeNavigationController = UINavigationController(rootViewController: welcomeController)
self.present(welcomeNavigationController, animated: false, completion: nil)
return
}
}
}
【问题讨论】:
-
错误信息很清楚。只需确保您的代码在主队列上运行即可。
-
好的。我以为是?...也许我应该多听 Xcode。我在函数中添加了 Dequeue.main 并且它起作用了。对 Swift 来说很新。
标签: ios swift facebook firebase twitter