Ios Firebase如何检查事务成功或失败?

Ios Firebase如何检查事务成功或失败?,ios,objective-c,firebase,Ios,Objective C,Firebase,我正在尝试更新事务中的firebase节点,很简单。按照文件: 最大的问题是: 如何检查此交易的结果(成功/失败)?我希望根据结果对UI进行一些更改。 SDK文档中的另一个方法似乎有回调,但它没有解释我应该检查哪个值。它说这个方法可以运行多次。我如何确定它何时给出“最终”结果? : 很抱歉,我是一个新手,没有一些示例,苹果风格的doc真的无法组合在一起。如果您只想等待最终值,那么您要查看的方法是运行TransactionBlock:andCompletionBlock:。下面是一些示例代码:

我正在尝试更新事务中的firebase节点,很简单。按照文件:

最大的问题是: 如何检查此交易的结果(成功/失败)?我希望根据结果对UI进行一些更改。

SDK文档中的另一个方法似乎有回调,但它没有解释我应该检查哪个值。它说这个方法可以运行多次。我如何确定它何时给出“最终”结果? :

很抱歉,我是一个新手,没有一些示例,苹果风格的doc真的无法组合在一起。

如果您只想等待最终值,那么您要查看的方法是运行TransactionBlock: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:

如果出现问题,您将得到一个
错误

如果您的数据已提交,
committed
将为YES。如果您在事务块中返回了
[ftTransactionResult abort]
,而不是
[ftTransactionResult successWithValue:
提交的
将为否

这意味着,如果您读取4处的计数器并尝试更新它。您可以尝试在其他人更新计数器的同时更新计数器。如果您首先进入,快照的值将为5。如果其他人的更新在您之前进入,
snapshot.value
将为6

不管谁先投票,你可能都想得到6分。为此,您需要添加一个观察者。其代码可能如下所示:

[upvotesRef observeEventType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) {
    NSLog(@"New Value: %@", snapshot.value);
}];
这样,您就不需要完成块来找出最终值,因为每次事务块发生时,观察者块都会触发。在上面的示例场景中,无论是谁先投票,它都会为5和6发射一次。如果您想知道您的特定事务是否成功,而不仅仅是现在该位置的值是多少,那么确实需要完成块

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

回顾一下你和另一个人同时试图提高投票率的例子。默认情况下,当您尝试将计数从4更新为5时,观察者将立即触发。实际事务可能会失败,因为其他人同时将向上投票计数从4推到5。然后,您的事务块将使用新数据5再次运行,并看到它应该将计数推到6。当本地事件设置为“否”时,观察者将在服务器让您知道其他人将向上投票计数从4推到5后触发,而不是在您尝试将计数从4更新到5时触发


这对于每个人都在增加投票的简单操作来说不是什么大问题,但是如果您可能正在推送来自其他用户的不同数据,那么该位置的任何观察者都可能在最终解决之前看到数据跳跃。

这个答案应该添加到Firebase API文档中。。。别开玩笑了,老实说,这是最好的解释。干杯brothers@katfang如果你能为斯威夫特写一个等价物,那将非常有帮助。非常感谢
[upvotesRef observeEventType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) {
    NSLog(@"New Value: %@", snapshot.value);
}];