【问题标题】:Store values from multiple loops into an array with Firebase. Swift使用 Firebase 将多个循环中的值存储到一个数组中。迅速
【发布时间】:2018-07-07 11:39:06
【问题描述】:

我一直在尝试弄清楚如何获取用户数据数组并将其与其他用户数组列表进行比较,以查看它是否与他们匹配。我查看了答案here,它表明我应该构造我的数据,使其非规范化,因此有重复。这种方法有效,但我现在正在努力将这些数组存储到一个数组中,以便以后使用。

这是我的数据结构的一个例子:

{
  “skills”: [
    {
      "name": "Walking"
    },
    {
      "name": "Running",
      "usersWithSkill": [
        “user1”: true,
        “user2”: true,
        “user3”: true
      ]
    },
    {
      "name": "Swimming",
      "usersWithSkill": [
        “user3”: true
      ]
    },
    {
      "name": "Dancing",
      "usersWithSkill": [
        “user1”: true,
        “user3”: true
      ]
    }
  ],
  "users": {
    "user1": {
      "firstName": "Amelia",
      "skillsList": [
        "1": true,
        "3": true
      ]
    },
    "user2": {
      "firstName": "Elena",
      "skillsList": [
        "1": true,
      ]
    },
    "user3": {
      "firstName": "John",
      "skillsList": [
        "1": true,
        "2": true,
        "3": true
      ]
    },
    “user4”: {
      "firstName": "Jack",
      "interestsList": [
        "1": true,
        "3": true
      ]
   }
  }
}

我可以查询 Jack 的兴趣。但是循环发生了两次,因此我正在努力添加一个数组来存储 Jack 正在寻找的用户的值。

这是我查询技能的方式:

var newArray = [String]()

func fetchSkillKeys() {

    // Loop through the array of interest keys
    for key in self.arrayOfInterestKeys {
        let interestRef = Database.database().reference(withPath: "skills/\(key)/usersSkill")
        interestRef.observeSingleEvent(of: DataEventType.value, with: { (snapshot) in
            for child in snapshot.children {
                guard let snapshot = child as? DataSnapshot else { continue }
                self.newArray.append(snapshot.key)
            }
            print(self.newArray)
        })
    }
}

这是我的数组在控制台上打印时的样子:

[]
["0", "1", "2"]
["0", "1", "2", "0", "1", "2"]
["0", "1", "2", "0", "1", "2", "0", "1"]

当我期待这样的事情时:

["0", "1", "2", "0", "1"]

更新

回复下面的评论,arrayOfInterestKeys 是从interestsList 中获取的键,我在查询我想观察的技能时用作参考,这是我获取它们的方法:

var arrayOfInterestKeys = [String]()

func fetchUserInterests() {

    guard let uid = Auth.auth().currentUser?.uid else { return }
    // Go to users interest list
    let databaseRef = Database.database().reference(withPath: "users/\(uid)/interestsList")

    // Observe the values
    databaseRef.observeSingleEvent(of: DataEventType.value, with: { (snapshot) in

        // Loop through the interests list
        for child in snapshot.children {
            guard let snapshot = child as? DataSnapshot else { continue }
            // Populate an empty array
            self.arrayOfInterestKeys.append(snapshot.key)
        }
   })
}

【问题讨论】:

  • 什么是键数组?当您开始查询时,那里有哪些值?
  • 请从 firebase 控制台为您的数据结构提供图像,当您执行此操作时print(self.arrayOfInterestKeys) 您会得到什么输出?
  • @DoesData 请查看更新后的答案。
  • @Ali 不确定您的意思,您要我截取我的 Firebase 数据结构的屏幕截图吗? print(self.arrayOfInterestKeys) 给了我 [1, 3] 这是 Jack 的兴趣。
  • 是的,我的 Firebase 数据结构截图

标签: ios firebase firebase-realtime-database


【解决方案1】:

你有:

for child in snapshot.children {
    guard let snapshot = child as? DataSnapshot else { continue }
    self.newArray.append(snapshot.key)
}
print(self.newArray)

试试:

for child in snapshot.children {
    let child = child as? DataSnapshot
    if let key = child?.key {
        // Make sure the key is not in the array
        if self.newArray.index(of: key) == nil {
            self.newArray.append(key)                                
        }
    }
}

我也想知道你在哪里打电话给fetchSkillKeys()

【讨论】:

  • 不知道你为什么要给我看这个……我有能力得到用户的兴趣键。我正在尝试获取与这些键匹配的用户。结果很好,但是如何存储与这些键匹配的用户数组?另外,我在 viewDidLoad 上调用了fetchUserInterests()。你会聊天吗?
  • 我看错了代码sn -p,但原理还是一样的。另外,您在哪里调用 fetchSkillkeys?知道这一点很重要......
  • 那是我不太确定的地方,我一直在fetchUserInterests() 中的interestsList 循环之后调用它。 IO 应该在哪里调用它,我在哪里可以打印这个newArray
  • 在 fetchUserInterests 完成之前不应调用它。您应该考虑使用完成处理程序来确定何时完成。在任何情况下,上面的代码都应该防止你看到的重复。
  • 我确实相信它与异步有关,但我已经使用完成处理程序创建了 fetch 函数,但它仍然无法正常工作。你能告诉我你的完成处理程序如何工作并显示你打印newArray的位置吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多