【问题标题】:How To Send Information To A Specific User With Firebase如何使用 Firebase 向特定用户发送信息
【发布时间】:2017-01-21 12:34:47
【问题描述】:

你好!首先,我将解释游戏的功能,然后是我的问题:

所以我正在制作一个应用程序,玩家可以在其中玩一个小游戏。 首先,他们会看到一个表格视图,其中显示了他们的名字。每个名字都是创建游戏房间的玩家的名字。

然后玩家选择一个游戏室进行游戏(仅允许 2 人),然后游戏将开始。游戏使用一个名为“阶段”的变量。这是我用来在 Firebase 数据库中存储数据的参考(代码如下)。我稍后会在应用程序中调用以获取当前游戏的“阶段”。

但是,当我更改引用的值时,它会为应用程序中的每个人更改它。所以无论你和谁比赛,如果一个人改变了价值,它会影响到所有人。那么,我该如何解决呢?

这就是我将数据存储到 Firebase 数据库的方式:

我首先创建引用以存储数据。

private lazy var currentPhaseRef: FIRDatabaseReference = FIRDatabase.database().reference().child("currentPhase")
private lazy var whoWonCurrentPhaseRef: FIRDatabaseReference = FIRDatabase.database().reference().child("whoWonCurrentPhase")

然后为了得到当前阶段,我观察它:

私有函数观察者CurrentPhase() {

    currentPhase = currentPhaseRef.observe(.childAdded, with: { (snapshot) -> Void in

        let phaseData = snapshot.value as! UInt

        self.currentPhase = phaseData

    })
}

我明白为什么这不起作用。它不起作用,因为我正在设置每个人都可以使用的值。

那么,我如何让每个用户的参考不同(例如:玩家 1 的 Did 是 123456,所以参考将是“123456CurrentPhase”)?这样,当他们玩游戏时,它会从个性化的参考名称中提取数据。但是我将如何与任一用户交流那是什么,以便他们都使用相同的参考?

另一种询问方式是我如何将其设置为两个用户都可以使用 ONE 个性化代码从中提取数据的位置。强>

注意:选择单元格进行游戏的玩家和实际开始游戏的玩家是两个不同的 ViewControllers/Code 文件。所以我不担心格式化一个控制器以在任一端工作。 IE。当您创建游戏并选择游戏时,他们会将您发送到两个不同的控制器。

感谢您的反馈,如果您需要更多详细信息或有任何疑问,请告诉我。 :)

【问题讨论】:

    标签: swift firebase firebase-realtime-database


    【解决方案1】:

    你需要分离你的游戏,你可以让你的数据库看起来像这样。

    {
      games : {
        fbgeneratedId1 : {
          host: userid1,
          client: userid2
          matched: true,
          gameid : fbgeneratedId1,
          WhoWonCurrentPhase: "Bob"
        },
        //case when a client joins the game
        fbgeneratediId2 : {
          host: userid1,
          matched: false,
          gameid:fbgeneratedId2
        }
        //a newly created game with only the host
      }
    }
    

    所以游戏将是您的游戏列表。当主机创建游戏时,游戏将被插入列表中,如下所示:

    var newGameRef =  FIRDatabase.database().reference().child("games").push();
    var myGameId = newGameRef.key
    //create a new game and store it's ID inside so its easy to access for updates
    newGameRef.set({
        host: userid1,
        matched: false,
        gameid: myGameId
    });
    

    当主机创建游戏时,他们必须知道游戏的密钥,而当客户端加入时,他们也应该知道密钥,这样他们就只能将游戏对象单独操作到他们的游戏中。所以你的相位参考变成:

    private lazy var whoWonCurrentPhaseRef: FIRDatabaseReference = FIRDatabase.database().reference().child("games/"+myGameId+"/whoWonCurrentPhase")
    

    您可以将该游戏标记为匹配,以便根据需要将其从游戏列表中过滤掉。注意:myGameId 将是 fbgeneratedIds 之一

    【讨论】:

    • 我会测试一下。我目前正在解决问题。因此,当玩家选择单元格时,会存储它的名称(每个单元格名称不同)。然后当玩家去创建一个新的引用时,名称就会被实现。创建游戏的玩家已经有了名字,客户端通过单元格获得了名字。想法?
    • 这听起来像一个类似的方法,但我不太清楚你所说的“细胞”是什么意思。
    • 单元格是表格视图中的各个行。 IE带有玩家的名字或者房间的名字。
    猜你喜欢
    • 2014-08-14
    • 2015-04-27
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    相关资源
    最近更新 更多