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

Posted

技术标签:

【中文标题】同步数组(针对喜欢/关注者)最佳实践 [Firebase Swift]【英文标题】:Synchronized Array (for likes/followers) Best Practice [Firebase Swift] 【发布时间】:2016-08-17 14:24:57 【问题描述】:

我正在尝试使用 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。这有几个问题:

    它不同步,因此如果在两个设备上同时调用它,一个数组将覆盖另一个数组,并且不会保存跟随者。 如果没有追随者,它就无法处理 nil 数组,程序将崩溃(不是主要问题,我可能可以通过选项来解决)。

我想知道为用户关注者或帖子点赞创建一个同步的 uid/tokens 数组的最佳做法是什么。我找到了以下链接,但似乎没有一个可以直接解决我的问题并且似乎还存在其他问题。我认为向有经验的社区询问是明智的做法,而不是把一堆解决方案一起弗兰肯斯坦。

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

感谢您的帮助!

【问题讨论】:

您应该在您发布的第二个链接中使用 runTransactionBlock。这将允许多个用户同时喜欢/不喜欢一个帖子。 感谢您的帮助,我的解决方案如下 很高兴你知道了! 【参考方案1】:

感谢 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 添加到user 的数组Following 中。它可以处理 nil 值并相应地进行初始化,如果用户已经关注 userToFollow 的 uid,它将忽略请求。如果您有任何问题,请告诉我!

一些有用的链接:

    firebase runTransactionBlock的cmets Upvote/Downvote system within Swift via Firebase的答案 我在上面发布的第二个链接

【讨论】:

你如何调用那个函数,调用函数时你会在括号内放什么?

以上是关于同步数组(针对喜欢/关注者)最佳实践 [Firebase Swift]的主要内容,如果未能解决你的问题,请参考以下文章

《接口测试最佳实践》回归

将领域与回收者视图一起使用的最佳实践?

响应式架构最佳实践——MVI

GRADLE 构建最佳实践

Express 开发与部署最佳实践

使用 Tweepy 在 Python 中获取关注者列表的最佳方法