同步数组(喜欢/关注者)最佳实践[Firebase Swift]

时间:2016-08-17 14:24:58

标签: arrays swift firebase synchronization firebase-realtime-database

我尝试使用Swift和Firebase创建基本的跟踪算法。我目前的实施如下:

static func follow(user: FIRUser, userToFollow: FIRUser) {
    database.child("users").child(user.uid).observeSingleEventOfType(.Value, withBlock: { (snapshot) in
        var dbFollowing: NSMutableArray! = snapshot.value!["Following"] as! NSMutableArray!
        dbFollowing?.addObject(userToFollow.uid)
        self.database.child("users/"+(user.uid)+"/").updateChildValues(["Following":dbFollowing!])
        //add user uid to userToFollows followers array in similar way
    }) { (error) in
        print("follow - data could not be retrieved - EXCEPTION: " + error.localizedDescription)
    }
}

这将从Firebase节点Following检索数组,添加userToFollow的uid,并将新数组发布到节点Following。这有一些问题:

  1. 它不是同步的,所以如果在两个设备上同时调用它,则一个数组将覆盖另一个数组,并且不会保存关注者。
  2. 如果没有关注者无法处理nil数组,程序将崩溃(不是主要问题,我可以用可选项解决)。
  3. 我想知道为用户关注者或帖子喜欢创建uid /令牌的同步数组的最佳做法是什么。我找到了以下链接,但似乎没有一个直接解决我的问题,似乎带来了其他问题。我认为向社区提出经验而不是Frankensteining一堆解决方案是明智的。

      

    https://firebase.googleblog.com/2014/05/handling-synchronized-arrays-with-real.html   https://firebase.google.com/docs/database/ios/save-data(将数据保存为交易部分)

    感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

感谢Frank,我找到了使用runTransactionBlock的解决方案。这是:

static func follow(user: FIRUser, userToFollow: FIRUser) {
    self.database.child("users/"+(user.uid)+"/Following").runTransactionBlock({ (currentData: FIRMutableData!) -> FIRTransactionResult in
        var value = currentData?.value as? Array<String>
        if (value == nil) {
            value = [userToFollow.uid]
        } else {
            if !(value!.contains(userToFollow.uid)) {
                value!.append(userToFollow.uid)
            }
        }
        currentData.value = value!
        return FIRTransactionResult.successWithValue(currentData)
        }) { (error, committed, snapshot) in
            if let error = error {
            print("follow - update following transaction - EXCEPTION: " + error.localizedDescription)
        }
    }
}

这会将userToFollow的uid添加到Following的数组user。它可以处理nil值并相应地进行初始化,如果用户已经关注userToFollow的uid,则会忽略该请求。如果您有任何问题,请告诉我们!

一些有用的链接:

  
      
  1. firebase runTransactionBlock
  2. 的评论   
  3. Upvote/Downvote system within Swift via Firebase
  4. 的答案   
  5. 我在上面发布的第二个链接
  6.