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

2023-12-30

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

https://www.firebase.com/docs/ios/guide/ saving-data.html 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文档中还有另一个方法似乎有一个回调,但它没有解释我应该检查哪个值。它说该方法可以多次运行。我如何确定它何时给出“最终”结果?https://www.firebase.com/docs/ios-api/Classes/Firebase.html#//api/name/runTransactionBlock:andCompletionBlock https://www.firebase.com/docs/ios-api/Classes/Firebase.html#//api/name/runTransactionBlock:andCompletionBlock:

抱歉,我是一个初学者,如果没有一些示例,苹果风格的文档真的无法组合在一起。


If you just想要等待最终值,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是你可以获得最终价值的地方。这是同一种类型FDataSnapshot如果你使用你会得到observeEventType:withBlock:

如果出现问题,您将得到一个error.

如果您的数据已提交,committed将会是“是”。如果你回来了[FTransactionResult abort]在你的交易块中而不是[FTransactionResult successWithValue:], committed将会是NO。

这意味着,如果您读取 4 处的计数器并尝试更新它。您可能会尝试与其他人同时更新计数器。如果你先进去的话snapshot.value将为 5。如果其他人的更新先于您到达,则snapshot.value将是 6。

无论谁先投票,您可能都希望达到 6 分。为此,您需要添加一个观察者。其代码可能如下所示:

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

有了这个,你就不用need完成块找出最终值,因为每次事务阻塞时,观察者块都会触发。在上面的示例场景中,无论谁先投票,它都会为 5 触发一次,为 6 触发一次。如果您想了解您的特定交易是否成功,而不仅仅是该位置现在的价值,那么您确实需要完成块。

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

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

对于像投票这样简单的事情来说,这并不是什么大问题,每个人都只是在增加,但如果您可能会从其他用户推送不同的数据,那么该位置的任何观察者都可能会看到数据在最终稳定之前跳跃。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firebase如何检查交易成功或失败? 的相关文章

  • Socket.io 400(错误请求)

    我的服务器上有这段代码 var express require express var routes require routes var user require routes user var http require http var
  • iOS 上的 OpenCV - VideoCapture 属性始终返回 1

    我一直在尝试构建一个简单的 OpenCV iOS 应用程序 该应用程序从捆绑包中加载视频并查询其帧数 持续时间等 然后它将尝试从中获取各个帧 不幸的是 当我使用VideoCapture类中 所有属性返回值 1 然后我尝试导航到frame 1
  • 具有动态警报正文的快速本地通知

    所以我可以创建一个像这样的本地通知 var localNotification UILocalNotification localNotification fireDate NSDate timeIntervalSinceNow 7 loc
  • Javascript循环不等待Firebase完成上传多个文件

    我正在尝试上传多个文件 然后在上传所有文件后执行一些代码 但我的循环不会等到每个上传完成 迭代文件 files is an array of local files from a
  • 删除派生数据文件夹后,Xcode 不断重新创建派生数据文件夹

    自动完成功能在 Xcode 6 中不再起作用 我四处搜索 发现删除派生数据文件夹可以解决此问题 每次我删除它时 它都会回来 然后就不会再自动完成了 有什么建议么 Thanks 没关系 我解决了这个问题 我没有声明需要在类内的方法中使用的变量
  • Objective-C 中是否有命名初始化方法的约定?

    在可以通过不同的 init 方法初始化的 Objective C 类中 将所有初始化程序共用的初始化代码收集到一个从其他 init 方法 有时也从从 Nib 唤醒 是否有关于如何命名该方法的约定 初始化器 初始化公共 根据 Apple 的说
  • 如何右对齐 UILabel?

    Remark 实施 myLabel textAlignment right does not解决了我的问题 这不是我所要求的 我想要实现的是让标签对齐右对齐 为了更清楚地说明 这就是如何left对齐外观 就是这样justify对齐外观 if
  • Google Firebase - 如何删除崩溃报告?

    我最终失明了吗 还是没有明显的方法可以通过 Google Firebase Web 控制台删除 Firebase 崩溃报告 我的 Android 应用程序已成功记录报告 但现在出现大量 开发崩溃 占用了我在控制台中的大部分视图 这使得找到实
  • 从 Mac 命令行访问 iOS 应用程序目录(沙箱)

    我需要使用 Mac 或 Linux 上的命令行 非 GUI 访问 iOS 设备上安装的应用程序的沙箱目录 这有助于开发和测试自动化 将 json 文件放入沙箱中可以让我设置参数 例如额外的调试消息和更小的刷新间隔 像 iFunBox 这样的
  • NSTimer 不触发选择器

    在带有 ARC 的 ios5 0 中 在我的 rootviewcontroller 中 我调用由应用程序委托持有的安全管理器对象中的方法 在该方法中 我设置计时器如下 NSTimer timer NSTimer scheduledTimer
  • Cordova 在 iOS 中显示警告“线程警告:[您的函数]花了 [n] 毫秒”

    THREAD WARNING Console took 81 661865 ms Plugin should use a background thread 在跑步的时候iOS 手机差距项目 对于一些剩余的插件 例如地理位置和文件系统 也是
  • 沙盒尝试恢复消耗性 IAP

    我一直在尝试在 iOS 上测试一些消耗性 IAP 但遇到了一个奇怪的错误 弹出一条警报 其中包含以下文本 此应用内购买已被购买 它将恢复为 自由的 环境 沙盒 我已经检查过 并且确定我的 IAP 可以在 iTunesConnect 中使用
  • 在视图之间传递核心数据实体变量

    我无法理解如何在视图之间使用核心数据实体变量 为了更好地理解我的问题是什么 我的代码如下 View A 基本上 您必须将完整预算实体或相关预算实体的 ID 从视图 A 传递到视图 B 由于不知道您的应用程序的视图层次结构和逻辑 我假设您选择
  • iOS 防止计时器 UILabel 在数字变化时“晃动”

    我有一个UILabel它以以下格式显示计时器的输出MM ss SS 分 秒 厘秒 但是随着厘秒宽度的变化 它从左向右 摇动 例如 11 比 33 窄 有什么办法可以减轻这种情况吗 我尝试过将其居中 给它固定的宽度 但它们似乎没有帮助 从iO
  • 高效创建 x 层深度的嵌套 for 循环

    这可能是一件简单的事情 但我需要创建一个循环结构 使其循环 y x 次以创建 x 和 y 的所有可能组合 例如 如果有 4 个 x 每个 x 有 2 个 y 我想做这样的事情 for int a 0 a lt y a for int b 0
  • Firebase 警告:使用 Firebase Cloud Function 搜索数据时使用未指定的索引

    我构建了一个 Firebase 云函数 用于查找 IsNotificationEnabled 值等于 true 的用户 我的部分职能 export const sendPushNotification functions https onR
  • iOS 视图控制器内存在被关闭后未释放

    当用户单击按钮时 它会显示一个带有两个视图控制器的新选项卡栏视图控制器 我是这样做的 ACLevelDownloadController dvc ACLevelDownloadController alloc initWithNibName
  • DatePicker 停止 CoreData 按预期工作

    我有一个应用程序 它保存 UIDatePicker 中的文本和日期 然后在您回到 UIDatePicker 中的该日期时显示该注释 效果很好 只有我发现将 UIDatePicker 日期设置为今天会停止 CoreData 工作 只有当我运行
  • 在 HTML5 iOS 7 / iOS 8 中显示十进制键盘

    经过几个小时的搜索后 我只是有一个简单的问题 是否有可能在网络浏览器输入字段中显示小数键盘 input type number 只显示数字 但我需要在左下角使用逗号或点 我尝试过任何事情 pattern step等等 但没有显示十进制键盘
  • iOS 电池监控 Swift

    我已将监控设置为启用 但模拟器和设备中的电池电量仍然为 1 UIDevice currentDevice batteryMonitoringEnabled true var level UIDevice currentDevice batt

随机推荐