【问题标题】:ios Swift Firebase sending irregular dataios Swift Firebase 发送不规则数据
【发布时间】:2017-06-24 22:49:26
【问题描述】:

我有一个 collectionView,我正在获取 firebase 数据库数据。我的 collectionView 创建发送 firebase indexpath.row。这行 0 , 1, 2, 3, ... 但 firebase 响应不规则数据,我参见 debug mod indexpath.row 16 , 3, 7 , 11...

有什么问题?

我分享我的示例代码。

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
     print(indexPath.row) // 1, 2, 3, 4
                self.ref.child(userID!).child(self.islemString).child(String(indexPath.row + 1)).observeSingleEvent(of: .value, with: { (snapshot) in
                        // Get user value

                        let value = snapshot.value as? NSDictionary
                        let asd = value?["xxx"] as? Int ?? 0

                        print(indexPath.row) // 16, 3, 7 ,9 

                        if(asd == 0) {
                            cell.imageKilit.image = UIImage(named: "kilit")

                        }
                        else{
                            cell.imageKilit.image = UIImage(named: "")

                        }


                    }

                    )

}

【问题讨论】:

  • 您的代码第 3 行非常神秘。索引路径需要不同的时间,因此在闭包中您不会以相同的顺序获得它们。
  • 我该如何解决?
  • 不用解决。顺序应该是非关键的。
  • 怎么样?你能举个例子吗?
  • 这种方法不会长期有效。如果您的表中有 100 行,则代码将加载 Firebase 100 次,等待返回来填充集合中的每个单元格。最好一次将所有 100 个加载到一个数组中,然后让集合视图使用 reloadData() 进行自我更新。此外,滚动和其他活动确实会受到影响 - 再次,一次加载您想要的数据或一部分数据(10 行,然后是另外 10 行等)将是一个更好的方向。跨度>

标签: ios firebase swift3


【解决方案1】:

响应 OP 要求示例代码的评论:

这是一个示例,但我不知道您的 Firebase 中存储了什么,因此我们将仅使用消息结构作为示例

messages
  msg_0
    msg: "Hello!"
  msg_1
    msg: "Another msg

当应用程序启动时,我们将在 viewDidLoad 中使用此代码来初始填充一个数组,该数组将用作我们的 collectionView、tableView 等的数据源。

var messagesArray = [String]()
var ref = //set to your firebase database

func viewDidLoad() {
    let messagesRef = self.ref.child("messages")
    messagesRef.observeSingleEvent(of: .value, with: { snapshot in
        for child in snapshot.children {
            let msgDict = child.value as! [String: AnyObject]
            let msg = msgDict["msg"] as! String
            self.messagesArray.append(msg)
        }

        self.myCollectionView.reloadData()
    })
}

然后,在集合视图中委托方法

func collectionView(_ collectionView: UICollectionView, cellForItemAt in...
   let msg = self.messagesArray[indexPath.row]
   //do something with the msg
}

如您所见,当您在 tableView 中滚动时,它只是从 dataSource 数组中提取数据,而不是不断地为每一行数据访问 Firebase。在这种情况下,我们使用的是一个简单的字符串,但它可以是一个消息对象数组,其中可以包含消息、发送者的姓名甚至他们的图像。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2018-02-20
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    相关资源
    最近更新 更多