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

时间:2016-09-03 09:07:55

标签: 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()

})

我尝试了解可能的原因并使用各种测试我现在知道这里的问题是数据没有足够快地加载到数组中 - 我认为使用这个异步加载会起作用但我觉得我遗漏了一些东西(仍然学习)。

解决: 这是一个固有的BAD问题,应该是如何不在StackOverlow上提问的一个例子。我不想让它陷入细节之中,这是一个错误。尽管缺乏信息,但感谢大家的意见。

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

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

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

    }

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

为这个糟糕的问题道歉。

1 个答案:

答案 0 :(得分:0)

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

self.geofireRef.removeAllObservers() 

observeEventType