如何在离线时将数据写入firebase? Swift3

时间:2017-07-23 14:47:42

标签: ios firebase swift3 firebase-realtime-database firebase-authentication

在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服务器收到响应之前Internet连接断开,则不会写入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

0 个答案:

没有答案