Ios Swift错误:n内部一致性异常&x27;上载尝试在非主队列上执行!仅在主队列上;

Ios Swift错误:n内部一致性异常&x27;上载尝试在非主队列上执行!仅在主队列上;,ios,swift,facebook,firebase,twitter,Ios,Swift,Facebook,Firebase,Twitter,我在我的应用程序(使用TwitterKit)上实现了一个使用Twitter登录的选项,但它在下面的函数上不断崩溃-saveUserIntoFirebaseDatabase(将用户数据、图像上载到Firebase数据库时)。我不明白下面的函数为什么需要在主队列中 用户数据被提取并保存到Firebase Auth部分,但是在尝试将用户数据保存到实时数据库和存储时,它似乎会崩溃 fileprivate func saveUserIntoFirebaseDatabase() { guard l

我在我的应用程序(使用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有以下功能来查看当前用户是否已登录,如果未登录,他们将被重新定向到欢迎控制器。这可能是原因吗

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
        }
    }
}

我认为您试图在后台线程上关闭viewcontroller。

错误消息非常清楚。只需确保代码在主队列上运行即可。确定。我以为是?…也许我应该多听Xcode。我向函数中添加了Dequeue.main,它就工作了。对斯威夫特来说很陌生。