Как записывать данные в firebase в автономном режиме? Swift3 - ios


0

В tableView у меня есть список заданий. К этим заданиям могут обращаться несколько пользователей, поэтому мне нужно использовать FIRTransaction. Основываясь на результате первой записи в FirebaseDatabase, мне нужно написать/не писать на другой путь в Firebase. Схема выглядит следующим образом:

//Claim job by - Cleaner
  //cleaner tries to claim booking at Users/UID/cus/bookingNumber
      //if FIRMutableData contains a key ‘claimed’ or key:value "claimed":true 
        //update at Users/UID/cus/bookingNumber with key:value

    //based on response received write or not to another path
       //write to Cleaners/UID/bookingNumber  
            //key:value

Если интернет-соединение падает до того, как клиентское приложение получит ответ от сервера firebase, запись в Cleaners/UID/bookingNumber не будет выполнена. Как я могу решить эту проблему?

 @IBAction func claimJob(_ sender: Any) {

     dbRef.runTransactionBlock({ (_ currentData:FIRMutableData) -> FIRTransactionResult in

  //if valueRetrieved is nil abort
   guard let val = currentData.value as? [String : AnyObject] else {
    return FIRTransactionResult.abort()
    }
           self.valueRetrieved = val

  guard let uid = FIRAuth.auth()?.currentUser?.uid else {
      print("abort no uid line 80")
         return FIRTransactionResult.abort()
        }
              self.uid = uid


     for key in self.valueRetrieved.keys {

     //unwrap value of claimed key
      guard let keyValue = self.valueRetrieved["Claimed"] as? String else {
        print("abort line 88")
               return FIRTransactionResult.abort()
          }

           //check if key value is true
               if keyValue == "true"{

                //booking already assigned show alert,stop transaction 
                self.alertText = "Booking already taken, please refresh table!"
                  self.alertActionTitle = "OK"
                     self.segueIdentifier = "unwindfromClaimDetailToClaim"
                        self.showAlert()
                  return FIRTransactionResult.abort()

            } else {
              //write the new values to firebase
               let newData =  self.createDictionary()
                 currentData.value = newData
                   return FIRTransactionResult.success(withValue: currentData)

      }//end of else
}//end of for key in self

         return FIRTransactionResult.abort()

    }) {(error, committed,snapshot) in

        if let error = error {
            //display an alert with the error, ask user to try again

         self.alertText = "Booking could not be claimed, please try again."
             self.alertActionTitle = "OK"
               self.segueIdentifier = "unwindfromClaimDetailToClaim"
                  self.showAlert()


            //what if internet connection drops here or client quits app ????????????
        } else if committed == true {

           //write to Cleaners/UID/bookingNumber

            //what if internet connection drops here or client quits app??????
              self.cleanersRef.setValue(snapshot?.value)

        self.alertText = "Booking claimed.Please check your calendar"
            self.alertActionTitle = "OK"
            self.segueIdentifier = "unwindfromClaimDetailToClaim"
              self.showAlert()
        }
    }

}//end of claimJob button
Источник
  •  90
  •  0
  • 14 апр 2020 2020-04-14 17:46:29

Ответов пока нет