firebase 实时数据库读取后立即更新视图计数

firebase realtime database update view count immediately after reading it

我有这个 firebase 实时数据库

{
  "posts" : {
    "-Mt8iPsoxOk2rXwfjVKF" : {
      "date" : 1641914412858,
      "user_name" : "aaaa",
      "post_id" : "CYjxpgaMz9P",
      "view_count" : 2
    },
    "-Mt8iPvXA4ALKqSX0dH-" : {
      "date" : 1641914413011,
      "user_name" : "bbb",
      "post_id" : "CDzbKl0lIK-",
      "view_count" : 0
    },
    "-Mt8iPxfJOax_U6TjYov" : {
      "date" : 1641914413155,
      "user_name" : "ccc",
      "post_id" : "B7NZYOnA_NG",
      "view_count" : 0
    }
  }
}

我想在阅读 post 后立即更新观看次数,我尝试使用此方法,但问题是我们在一秒钟内有很多读取,因此需要时间来阅读更新视图,我们需要将 post 限制为 5 个视图然后删除它,但我们不能这样做,因为在一秒钟内我们有超过 10 个视图每个视图需要时间来更新视图计数所以下一个用户将继续阅读相同的 post,即使 post 超出了观看次数限制。

[recentPostsQuery observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
    
    self->user_name = snapshot.children.allObjects.firstObject.value[@"user_name"];
    self->post_key  = snapshot.children.allObjects.firstObject.key;

    [[[[self.ref child:@"posts"]child:self->post_key]child:@"view_count"]setValue:[FIRServerValue increment:@1]];
    
}];

在所有用户都直接访问数据的大规模多用户环境中,无法像您描述的那样强制执行硬限制。

如果硬限制是您的应用程序的硬性要求,请考虑将对数据的所有访问路由到服务器端组件,然后该组件可以强制执行此要求。如果您还没有服务器,可以考虑为此使用 Cloud Functions 或 Cloud 运行。