Firebase如何检查交易成功或失败?

我正在尝试更新事务中的firebase节点,简单的东西。 跟随文档:

https://www.firebase.com/docs/ios/guide/saving-data.html

Firebase* upvotesRef = [[Firebase alloc] initWithUrl: @"https://docs-examples.firebaseio.com/web/saving-data/fireblog/posts/-JRHTHaIs-jNPLXOQivY/upvotes"]; [upvotesRef runTransactionBlock:^FTransactionResult *(FMutableData *currentData) { NSNumber *value = currentData.value; if (currentData.value == [NSNull null]) { value = 0; } [currentData setValue:[NSNumber numberWithInt:(1 + [value intValue])]]; return [FTransactionResult successWithValue:currentData]; }]; 

最大的问题是: 如何检查此次交易的结果(成功/失败)? 我希望做一些UI的变化取决于它的结果。

SDK文件中有另一种方法似乎有一个callback,但它没有解释我应该检查哪个值。 而且它说有关该方法的东西可以运行多次。 如何确定何时给出“最终”结果? https://www.firebase.com/docs/ios-api/Classes/Firebase.html#//api/name/runTransactionBlock:andCompletionBlock :

对不起,我是这样一个初学者,苹果风格的文件真的没有一些例子来聚在一起。

如果你只是想等待最后的值, runTransactionBlock:andCompletionBlock:是你想要看的方法。 以下是一些示例代码:

 [upvotesRef runTransactionBlock:^FTransactionResult *(FMutableData *currentData) { NSNumber *value = currentData.value; if (currentData.value == [NSNull null]) { value = 0; } [currentData setValue:[NSNumber numberWithInt:(1 + [value intValue])]]; return [FTransactionResult successWithValue:currentData]; } andCompletionBlock:^(NSError *error, BOOL committed, FDataSnapshot *snapshot) { if (error) { NSLog(@"Error: %@", error); } if (committed) { NSLog(@"Data committed"); } NSLog(@"Final Value: %@", snapshot.value); }]; 

那里的最后一个值, snapshot.value是你可以得到你的最终价值。 如果您使用observeEventType:withBlock: ,则会得到observeEventType:withBlock:

如果出现问题,你会得到一个error

如果你的数据被提交, committed将是YES。 如果您在事务块中返回了[FTransactionResult abort]而不是[FTransactionResult successWithValue:] ,则committed将为NO。

这意味着,如果您在4点读取计数器并尝试更新它。 您可能会尝试在别人同时更新计数器。 如果你先进入, snapshot.value将是5.如果其他人的更新进入之前, snapshot.value将是6。

不pipe谁先投了票,你可能都想起来6。 要做到这一点,你需要添加一个观察者。 代码可能如下所示:

 [upvotesRef observeEventType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) { NSLog(@"New Value: %@", snapshot.value); }]; 

有了这个,你不需要完成块来找出最终的值,因为每次事务阻塞,观察块就会被触发。 在上面的示例场景中,无论先进先出是谁,都会一次启动5次,每次启动6次。 如果您想知道您的特定交易是否成功,那么您确实需要完成区块,而不仅仅是现在的位置。

而且,为了完整,还有一个方法叫做runTransactionBlock:andCompletionBlock:withLocalEvents: 如果其他人也正在写入相同的位置,事务块可能会运行多次。 如果发现它在陈旧的数据上运行,就会发生这种情况。 当它在新数据上成功运行时,它将调用完成块。 然而,你会发现每次运行时,都会触发该位置的任何观察者块。 如果你不想发生这种情况,你应该把NO传递给withLocalEvents: 只要确认的写入完成,您的Firebase将在该位置触发事件,但您本地事务的临时写入(未经确认)将不会。

回顾一下你和另外一个人试图同时注册的例子。 默认情况下,只要您尝试将计数从4更新为5,观察者就会触发。实际的事务可能会失败,因为其他人同时将上移计数从4推到了5。 然后您的事务块将会以新数据5再次运行,并看到它应该将计数值推到6.当本地事件设置为NO时,观察者将在服务器让您知道其他人将推动计数从4到5,而不是当您尝试更新计数从4到5。

这对于每个人都只是递增的简单事情来说并不是什么大事,但是如果你可能会推送来自其他用户的不同数据,那么在这个位置的任何观察者都可能会看到数据在最终解决之前跳来跳去。