等待地理编码循环完成

时间:2015-03-29 02:44:01

标签: ios swift asynchronous grand-central-dispatch geocoding

所以我理解iOS中的地理编码是一种异步方法,现在我正在开发一个应用程序来访问Parse(对于餐馆)的地址列表,并对每个地址执行前向地理编码。理想情况下,我希望在经过几天的挣扎之后,在填充表格之前执行此操作,这对我来说不会发生。

我的问题是如何在我的应用程序中发生任何其他事情之前完成前向地理编码的迭代? 我正在尝试寻找宏观的中央调度方法,我尝试了这个教程,但我没有运气: http://www.raywenderlich.com/79150/grand-central-dispatch-tutorial-swift-part-2

这是我的代码: 正如您将看到我正在尝试将找到的CLLocations放入

var storeDict:NSDictionary =  [CLLocation:PFObject]()

    override func queryForTable() -> PFQuery! {
    var query:PFQuery = PFQuery(className: self.parseClassName)
    query.whereKey("Food", equalTo: foodName)
    var prices = query.findObjects()
    var i = 0
    println(prices.count)
    let geoCoder = CLGeocoder()
    for price in prices {
        var location:String = price.objectForKey("Address") as String
        geoCoder.geocodeAddressString(location, completionHandler:
            {(placemarks: [AnyObject]!, error: NSError!) in
                if error != nil {
                    println("Geocode failed with error: \(error.localizedDescription)")
                } else if placemarks.count > 0 {
                    var placemark = placemarks[0] as CLPlacemark
                    var location = placemark.location
                    var coordinateLocation:CLLocation = CLLocation(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude) as CLLocation
                    print(price)
                    print(coordinateLocation)
                    self.Restaurant[coordinateLocation] = price as? PFObject
                    print(i)
                    i++
                }
    })
    println("check")

    }
    return query
}

1 个答案:

答案 0 :(得分:1)

首先,您可能希望通知用户他们在应用程序中无法执行任何操作,直到数据加载完成(并进行地理编码)。您可以在其上添加一个带有旋转轮的半透明视图,以防止用户与应用程序进行交互。

该表格完全不知道您在这个过程中的位置 - 您是否已经开始进行地理编码,完成地理编码或者多久以前运行地理编码。它应该不知道你是否甚至要求去餐馆。所有它知道的是它的数据源,如果该数据源有对象,那么它将使用它来填充表中的行。

假设数据源是一个Restaurant对象数组。如果数组为空,则表将为空。您可以在数组上执行KVO,这样无论何时更新数据源,都会在tableView上调用reloadData

现在,您已将表格分离为您已处理的单独问题。不是查询和地理编码。

目前,你不是在后台用块查询Parse,但是在查询完成之前你真的要暂停程序。我理解为什么你选择这样做,因为你担心在查询完成之前什么都不做,但在后台执行会好得多。

查询完成后,您将逐个遍历生成的对象和地理编码。请注意,Apple不允许您一次对大量对象进行地理编码 - 它们会限制您,因此我将限制查询仅返回您需要的对象数量。完成对象的地理编码后,将其添加到数据源。这将触发表的重新加载,您的数据将会出现。

现在说你查询了20个对象。每次地理编码完成后,您的tableview都将重新加载。在调用重新加载之前,等待地理编码在所有20个对象上完成可能会更好。实际上,您可以将每个地理编码操作添加到队列中,每个操作将其地理编码对象添加到某个临时数组,然后添加一个用临时数组更新数据源的操作。此时,表格将使用新数据进行更新。请注意,这样做的缺点是某些地址可能需要比其他地址更长的地理编码,因此它不会显示到目前为止能够进行地理编码的任何数据,而是等待所有内容完全地理编码。

最后,您可以在后台运行查询,并在其完成块中进行地理编码。如果视图刚刚第一次加载,它可以显示旋转轮,直到更新数据源。更新数据源后,将移除旋转轮。