ios - 通过异步调用问题将数据加载到数组中(Geofire、Swift)

标签 ios swift asynchronous tableview geofire

我使用 Firebase 位置模块 Geofire 来搜索查询我附近的一些位置。该查询填充一个数组,然后该数组应显示在表上(通过表重新加载)。不幸的是,当 TableView 重新加载时,数组尚未加载数据(count = 0)。 我正在使用异步回调(特别是在 Geofire 中烘焙的回调,应该在整个查询完成后触发),但尽管我读过有关该函数的内容,但我似乎无法让它工作。这是文档:https://github.com/firebase/geofire-objc

关于如何在不添加计时器来延迟我的重新加载表代码的情况下顺利完成这项工作,有什么建议吗?

这里是一些示例代码:

var keyArray = [String]()
let query = geoFireSearchQuery(someLocation)

query.observeEventType(.KeyEntered, withBlock: { (key: String!, location: CLLocation!) in

    keyArray.append(key)

})

query.observeReadyWithBlock({

    self.tableView.reloadData()                

    self.geofireRef.removeAllObservers()

})

我尝试解决可能的原因并使用各种测试,我现在知道这里的问题是数据加载到数组的速度不够快 - 我认为使用这种异步加载会起作用,但我觉得我错过了一些东西(仍然学习)。

已解决: 这本质上是一个糟糕的问题,应该成为如何不在 StackOverlow 上提问的示例。我不想让细节陷入困境,这是一个错误。尽管缺乏信息,还是感谢大家的意见。

我遇到的问题是我的数组是这样创建的: 查询大数据集,对数据进行计算,存储在大对象中,存储在数组中,然后对大对象数组进行排序。繁重的计算。

我的hacky解决方案是使用keys.count作为任何给定查询的最终(大)数组中的对象数量的计数器。 然后我设置了一个“did Set”变量,每次添加大数组时都会触发该变量。在 did Set block 中我写了一个简单的 if 语句;

static var bigArray = [HugeObjects]() {
        didSet {
            if self.bigArray.count == self.keys.count {
                tableView.reloadData()
            }
        }

    }

缺点是每次将对象添加到数组时都会触发 didSet(虽然上限为 30),但我不知道这会对性能产生多大影响。不过,该解决方案有效,因为 tableView 现在会在 bigArray 完全写入并排序后重新加载。

对这个不好的问题表示歉意。

最佳答案

看起来 self.geofireRef.removeAllObservers() 是罪魁祸首。如果删除观察者,将永远不会调用observeReadyWithBlock。你不应该这样做

self.geofireRef.removeAllObservers() 

observeEventType

关于ios - 通过异步调用问题将数据加载到数组中(Geofire、Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39305195/

相关文章:

javascript - "Async"遍历 javascript 中的对象

ios - iOS 应用程序中的 3D 对象

iphone - Objective-C 如何有选择地禁用用户交互

ios - Swift 3,框架 IBOutlet 属性始终展开可选

ios - 检查背景音乐是​​否已经在播放

swift - 你应该如何处理 UIAlertAction 的闭包参数

ios - 检索缩放后的 UIView 的正确位置

swift - 为什么不能在 map 语句中使用键路径语法?

.net - 为什么.net中没有异步文件删除功能?

c# - Windows Phone 8.1 从远程 URL 占位符加载图像