我查看了数小时的代码和注释,并努力寻找任何文档来帮助我在具有Firebase的快速应用程序中对对象进行增减。
我有一张图片库,我想为图像添加instagram风格。该用户已经使用firebase auth登录,所以我有他们的用户ID。
我只是想弄清楚方法以及需要在firebase中设置哪些规则。
任何帮助都是极好的。
我将描述如何在社交网络应用程序Impether中使用Swift和实现此类功能Firebase。
Swift
Firebase
由于赞成和反对是类似的,因此我将仅描述赞成。
总体思路是将upvotes计数器直接存储在与该计数器相关的图像数据相对应的节点中,并使用事务写入来更新计数器值,以避免数据不一致。
例如,假设您在path处存储了一个图像数据/images/$imageId/,其中$imageId的id是用于标识特定图像的唯一ID-例如,它可以通过Firebase for iOS中包含的childByAutoId函数生成。然后,与该节点上的一张照片相对应的对象看起来像:
/images/$imageId/
$imageId
$imageId: { 'url': 'http://static.example.com/images/$imageId.jpg', 'caption': 'Some caption', 'author_username': 'foobarbaz' }
我们想要做的是向该节点添加一个upvote计数器,因此它变为:
$imageId: { 'url': 'http://static.example.com/images/$imageId.jpg', 'caption': 'Some caption', 'author_username': 'foobarbaz', 'upvotes': 12, }
当您创建新图像时(可能是用户上传图像时),您可能要0根据您要实现的目标使用或其他常数初始化upvote计数器值。
0
在更新特定的upuptes计数器时,您要使用事务以避免其值不一致(当多个客户端想要同时更新一个计数器时,可能会发生这种情况)。
幸运的是,处理事务中写道Firebase,并Swift是超级简单:
func upvote(imageId: String, success successBlock: (Int) -> Void, error errorBlock: () -> Void) { let ref = Firebase(url: "https://YOUR-FIREBASE-URL.firebaseio.com/images") .childByAppendingPath(imageId) .childByAppendingPath("upvotes") ref.runTransactionBlock({ (currentData: FMutableData!) in //value of the counter before an update var value = currentData.value as? Int //checking for nil data is very important when using //transactional writes if value == nil { value = 0 } //actual update currentData.value = value! + 1 return FTransactionResult.successWithValue(currentData) }, andCompletionBlock: { error, commited, snap in //if the transaction was commited, i.e. the data //under snap variable has the value of the counter after //updates are done if commited { let upvotes = snap.value as! Int //call success callback function if you want successBlock(upvotes) } else { //call error callback function if you want errorBlock() } }) }
上面的片段实际上几乎就是我们在生产中使用的代码。希望对您有所帮助:)