Segue после завершения загрузки / выгрузки firebase - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь запустить какой-то код после того, как firebase завершит загрузку / выгрузку (например, segue или refresh)

например

У меня есть функции сохранения x3, которые имеют код для обновления как хранилища, так и базы данных определенных данных (например, текста и изображений)

save1()
save2()
save3()

при выполнении IBAction я хотел бы, чтобы эти функции выполнялись и по завершении, если нет ошибок, выполнять другую функцию при завершении (переход или обновление)

эти 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
    }

Мне нужно завершить загрузку до того, как будут выполнены переходы, поскольку следующее представление будет обновлять сохраненные данные, которые я пытаюсь загрузить.

любая помощь была бы отличной, занимался этим уже несколько недель :( Я пробовал обработчики завершения, но пока не повезло.

заранее спасибо

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Вы можете проверить, сохранены ли изменения с помощью .childChanged, примерно так:

    save1()
    save2()
    save3()

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

    }
})

Возможно, вам следует использовать UIActivityIndicatorView, чтобы показать, что что-то происходит в фоновом режиме.

@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 / на правильный дочерний элемент (что должно измениться после сохранения).

0 голосов
/ 03 сентября 2018

Я думаю 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()
   }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...