同步数组(针对喜欢/关注者)最佳实践 [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]的主要内容,如果未能解决你的问题,请参考以下文章