【问题标题】:Segue after firebase download/upload completesFirebase 下载/上传完成后进行 Segue
【发布时间】:2018-09-03 20:18:36
【问题描述】:

我试图在 firebase 完成下载/上传(例如 segue 或刷新)后运行一些代码

例如

我有 x3 个保存函数,它们都有代码来更新某些数据(例如文本和图像)的存储和数据库

save1()
save2()
save3()

当执行 IBAction 时,我希望这些函数运行,如果它们没有错误,则在完成时执行另一个函数(segue 或 refresh)

这 3 个保存功能目前在 IBAction 中工作

@IBAction func saveTap(_ sender: Any) {

save1()
save2()
save3()

}

保存功能如下:

(我检查图像是否已更改,然后开始上传过程)

 func save1(){

    if image1.image == nil {
        let gender = userGender.text
        self.databaseRef.child("users").child(gender!).child(Auth.auth().currentUser!.uid).child("images").child("imageOne").removeValue { (error, ref) in
            if error != nil {
                print(error!)}
        }
        let imageRef = self.storage.child(Auth.auth().currentUser!.uid).child("image1")
        imageRef.delete { error in
            if let error = error {
                print(error)
            } else {
                print("Photo 1 image deleted")}
        }

    } else {

        //Firebase child references
        let profileImageRef = storage.child(Auth.auth().currentUser!.uid).child("image1")
        let metaData = StorageMetadata()
        metaData.contentType = "image1/jpeg"
        //Firebase child references

        //change uiimageview to uiimage for upload
        guard let image = image1.image else
        {return}
        //change uiimageview to uiimage for upload

        //Send to firebase storage
        profileImageRef.putData(image.jpegData(compressionQuality: 0.1)!, metadata: metaData) { (data, error) in
            if error == nil
            {print("Photo 1 uploaded to storage")}
            else
            {print(error?.localizedDescription as Any)}}
        //Send to firebase storage


        //Update firebase database
        profileImageRef.downloadURL(completion: { (url, error) in
            if error != nil{
                print(error!)
                return}

            if let profilePhotoUrl = url?.absoluteString{
                let newValuesForProfile = profilePhotoUrl
                let gender = self.userGender.text
                self.databaseRef.child("users").child(gender!).child(Auth.auth().currentUser!.uid).child("images").child("imageOne").setValue(newValuesForProfile, withCompletionBlock: { (error, ref) in
                    if error != nil{
                        print(error!)
                        return}
                    print("Photo 1 updated in database")})}})
        //Update firebase database
    }

我需要在执行转场之前完成上传,因为下一个视图将刷新到我尝试上传的已保存数据。

任何帮助都会很棒,已经有好几个星期了:( iv 尝试了完成处理程序,但到目前为止还没有运气。

提前谢谢你

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database


    【解决方案1】:

    我认为dispatchGroup 适合你的情况

    let dispatchGroup = DispatchGroup()
    
    dispatchGroup.enter()
    save1 { dispatchGroup.leave() }
    
    dispatchGroup.enter()
    save2 { dispatchGroup.leave() }
    
    
    
    dispatchGroup.notify(queue: .main) {
      self.perFormSegue//////
    }
    

    //

    // e.x 结构

    func save1(completion:@escaping()->()) {
    
      firesCallBack {       
       if success {
          completion()
       }
      }
    }
    

    【讨论】:

    • 感谢您的回复 :) 不幸的是,当我将其输入到 IBAction 时,我收到错误消息“传递给不带参数的调用的参数”
    • 好的,谢谢。我已经用保存功能的详细信息更新了我的问题。我应该把我的完成放在哪里。再次感谢。
    【解决方案2】:

    您可以检查更改是否使用 .childChanged 以某种方式保存,如下所示:

        save1()
        save2()
        save3()
    
    let ref: DatabaseReference!
    ref = /YourDirectDatabaseReferenceForTheChangedNode/
    ref.observe(.childChanged, with: {(snaphost) -> Void in
    
        }
    })
    

    也许您也应该使用 UIActivityIndi​​catorView 来显示后台正在发生的事情。

    @IBAction func saveTap(_ sender: Any) {
    
               save1()
               save2()
               save3()
    
            let activity: UIActivityIndicatorView = UIActivityIndicatorView()
                activity.center = self.view.center
                activity.hidesWhenStopped = true
                activity.activityIndicatorViewStyle = .whiteLarge
                self.view.addSubview(activity)
    
             let ref: DatabaseReference!
             ref = /YourDirectDatabaseReferenceForTheChangedNode/
             ref.observe(.childChanged, with: {(snaphost) -> Void in
    
               activity.stopAnimating()
               if UIApplication.shared.isIgnoringInteractionEvents {
                  UIApplication.shared.endIgnoringInteractionEvents()
               }
            self.performSegue(withIdentifier: "backhome", sender: self)
            }
        })
     }
    

    将 /YourDirectDatabaseReferenceForTheChangedNode/ 替换为正确的子节点(保存后应更改的内容)。

    【讨论】:

    • 嗨,谢谢你的回复:) 我如何用这个进行转场?我的segue是self.performSegue(withIdentifier: "backhome", sender: self),我希望上传完成后实现这个,再次感谢
    • 检查我的编辑 :) 我的问题:所有三个 save() 方法都保存到具有不同孩子的 firebase?
    • 是的,所以基本上我有一个用户,其节点包含 3 个图像。当用户点击保存时,这 3 张图像会被保存。保存完成后,id 喜欢返回自己的页面并更新。我已经在下一个可以正常工作的控制器上进行了更新。问题是 segue 发生得很快,然后在上传完成之前下载发生
    • 也许你应该用一种方法来制作它,它更容易。
    • 恐怕我不是那么熟练 :( iv 自学了大约 6 个月的编码。这是一个非常缓慢的过程,哈哈。我不会如何编辑我的函数来上传我所有的图像。再次感谢帮助我:) iv 用我使用的上传功能更新了我的问题。
    猜你喜欢
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 2018-11-16
    • 1970-01-01
    • 2018-12-21
    • 2016-10-15
    相关资源
    最近更新 更多