2017-09-04 44 views
0

我正在初始化Firebase中的一些數據,我將使用它來跟蹤用戶的活動。我需要確保將這些數據寫入Firebase,因此我想知道確保關鍵上傳成功的最佳做法是什麼?Swift 3:如何在失敗時重試Firebase上傳

static func createUserActivityCounts(uid: String) { 
     DispatchQueue.global(qos: .background).asyncAfter(deadline: .now() + .seconds(5)) { 
      let databaseReference = Database.database().reference() 
      let userCounts: [String: Any] = ["posts": 0, 
              "comments": 0, 
              "likes": 0] 
      databaseReference.child("userActivity").child(uid).child("counts").setValue(userCounts) { (error, ref) -> Void in 
       if error != nil { 
        print(error!.localizedDescription) 
       } 
      } 
     } 
    } 

回答

0

我認爲解決這個問題的最好辦法是檢查每當你嘗試查詢關鍵上傳存在的價值。如果該值不存在,那麼您將其初始化。這是我寫的處理這個的函數。

private func getUserActivityCounts() { 
    if let uid = Auth.auth().currentUser?.uid { 
    userRef.child("userActivity").child(uid).child("counts").observeSingleEvent(of: .value, with: { snap in 
      if !snap.exists() { 
       // create user counts 
       if let uid = Auth.auth().currentUser?.uid { 
        DatabaseFunctions.createUserActivityCounts(uid: uid) 
       } 
      } 
      if let counts = snap.value as? [String: Any] { 
       if let numberOfLikes = counts["likes"] as? Int, let commentCount = counts["comments"] as? Int, let postCount = counts["posts"] as? Int { 
        DispatchQueue.main.async { 
         self.headerRef.postCount.text = String(postCount) 
         self.headerRef.commentCount.text = String(commentCount) 
         self.headerRef.likeCount.text = String(numberOfLikes) 
         self.collectionView.reloadData() 
        } 
        self.numberOfUserPosts = postCount 
        self.commentCount = commentCount 
        self.likeCount = numberOfLikes 
       } 
      } 
     }) 
    } 
}