【问题标题】:Does a Firebase observer in a table cell count as an observer for each instance?表格单元格中的 Firebase 观察者是否算作每个实例的观察者?
【发布时间】:2017-01-13 09:19:43
【问题描述】:
如果我在每个单元格中都有一个包含图像的表格,并且我将 Firebase .observer 放在自定义 tableview 单元格类中,那么这是否算作为表格的每个单元格运行观察者?
因此,如果 10 个用户每人发布 10 个单元格并且表格中有 100 个单元格,那么 Firebase 是否基本上认为这与拥有 100 个观察者相同?这是糟糕的设计吗?
发布此消息后,我在思考UITableViews 的工作原理,可能当前不在屏幕上的单元格实际上不会让观察者继续运行。如果这样工作,那将非常方便和高效,请告诉我。
【问题讨论】:
标签:
ios
swift
uitableview
firebase
firebase-realtime-database
【解决方案1】:
{
"users": {
1: {
"username": "david"
}
},
"posts": {
1: {
"text": "Hello World!"
}
}
"user-posts": {
1: {
1: true
}
}
}
鉴于您的数据库结构看起来像这样,您可能希望观察用户路径上的ChildAdded 事件。对于您想要观察他们的用户帖子的每个孩子(用户),例如user-posts/1 会给你一个帖子ID列表。使用这些帖子 ID,您可以为每个键填充一个表格视图单元格并观察完整的帖子,例如posts/1。请记住,一旦您创建了观察者,除非您将其删除,否则无论单元格是否在屏幕上,它都会继续监听。当单元格结束显示时,您可以使用相应的 Table View Delegate 方法移除观察者。
【解决方案2】:
根据您的设计,您可能有一个或多个观察者。如果您有一个调用 Firebase 的 observeEvent 的类的实例,那么是的,您将有一个单独的观察者到 Firebase 的数据库,但这仍然是与数据库的一个连接,因为您可能通过主要的 @987654323 执行此操作@。
同样,这取决于您如何实现表格视图。你可以看看UITableViewCell documentation,尤其是带有可重复使用单元格的部分和reuseIdentifier。如果你以这种方式实现它,你将始终在内存中只分配(屏幕上的单元格数 + 1)个单元格,这意味着相同数量的观察者。
【解决方案3】:
首先,您是正确的,不在屏幕上的单元格实际上还没有“存在”。
通常,您不希望在单元格本身内部执行任何密集的操作(API 调用、渲染等),因为当您滚动时,tableview.dequeuereusablecellwithidentifier 必须针对正在生成的每个单元格运行代码。滚动时您会体验到明显的断断续续/滞后(您可能在模拟器上不会注意到,因为如今的计算机速度非常快)。