ios - 等待地理编码循环完成

标签 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
}

最佳答案

首先,您可能想要通知用户,在数据加载(和地理编码)完成之前,他们不能在应用程序中执行任何操作。您可以添加一个带有旋转轮的半透明 View ,以防止用户与应用交互。

该表应该完全不知道您在该过程中的位置——您是开始地理编码、完成地理编码,还是多久前运行了地理编码。它应该不知道您是否甚至查询过餐厅。它只知道它的数据源,如果该数据源有对象,那么它将使用它来填充表中的行。

假设数据源是 Restaurant 对象的数组。如果数组为空,则表将为空。您可以对数组执行 KVO,这样每当数据源更新时,就会在 tableView 上调用 reloadData

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

目前,您不是在后台使用 block 查询 Parse,而是在字面上暂停程序,直到查询完成。我理解您为什么选择这样做,因为您担心在查询完成之前什么都不做,但在后台执行会好得多。

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

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

最后,您可以让查询在后台运行,并在其完成 block 中进行地理编码。如果 View 是第一次加载,它可以显示纺车直到数据源被更新。当数据源更新时,纺车被移除。

关于ios - 等待地理编码循环完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29325073/

相关文章:

ios - 使用 Xamarin iOS 设计器添加等宽约束

ios - 多个UITableView可以使用同一个UITableviewcell吗?

ios - 获取在 iOS 上的来电中显示的联系人图像

iphone - 如何让ui始终响应并进行后台更新?

c# - 使用 async-await 可以给您带来任何性能优势吗?

ios - 设置 backgroundColor 似乎不适用于 UIView

ios - 如何在 iPad 上隐藏状态栏?

asp.net-ajax - AJAX - 如何将值传递回服务器

ios - 如何防止应用程序备份到 iCloud

ios - 如何在 Swift 中将 UIButton 居中?