我尝试使用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
。这有一些问题:
我想知道为用户关注者或帖子喜欢创建uid /令牌的同步数组的最佳做法是什么。我找到了以下链接,但似乎没有一个直接解决我的问题,似乎带来了其他问题。我认为向社区提出经验而不是Frankensteining一堆解决方案是明智的。
https://firebase.googleblog.com/2014/05/handling-synchronized-arrays-with-real.html https://firebase.google.com/docs/database/ios/save-data(将数据保存为交易部分)
感谢您的帮助!
答案 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,则会忽略该请求。如果您有任何问题,请告诉我们!
一些有用的链接:
- firebase runTransactionBlock
的评论- Upvote/Downvote system within Swift via Firebase
的答案- 我在上面发布的第二个链接
醇>