【问题标题】:iOS Swift - CLGeocoder completionHandler blockiOS Swift - CLGeocoder 完成处理程序块
【发布时间】:2015-01-02 23:16:32
【问题描述】:

我正在尝试将位置 (CLLocation) 解析为字符串。

    func locationToString (currentLocation: CLLocation) -> String? {
    var whatToReturn: String?
    CLGeocoder().reverseGeocodeLocation(currentLocation, completionHandler: { (placemarks: [AnyObject]!, error: NSError!) in
        if error == nil && placemarks.count > 0 {
            let location = placemarks[0] as CLPlacemark
            whatToReturn = "\(location.locality) \(location.thoroughfare) \(location.subThoroughfare)"

        }
    })
    return whatToReturn
}

显然,whatToReturn 总是返回 null,因为 completionHandler 在后台运行。 我很难理解如何在完成处理程序完成时更新我的​​字符串?

谢谢。

【问题讨论】:

  • 你对字符串的最终目标是什么?这必须在完成块的某个地方触发。
  • 我想使用字符串 (whatToReturn) 并将其放入 textField 中。但是,我没有从控制器本身使用这个方法,所以我需要一种方法来更新返回的字符串......
  • 最好的方法可能是在完成块中设置你的 textField 的文本。 [查看答案]
  • 最好的?我确定不是。这是最简单的(:

标签: ios swift cllocation clgeocoder cllocationcoordinate2d


【解决方案1】:

如果您想在 textField 中使用您的字符串,如 cmets 中所示,请执行以下操作:

func getAndDisplayLocationStringForLocation(currentLocation: CLLocation) {
    CLGeocoder().reverseGeocodeLocation(currentLocation, completionHandler: { (placemarks: [AnyObject]!, error: NSError!) in
        if error == nil && placemarks.count > 0 {
            let location = placemarks[0] as CLPlacemark
            self.textField.text = "\(location.locality) \(location.thoroughfare) \(location.subThoroughfare)"

        }
    })
}

但是,如果您需要在其他地方访问,则可以将闭包作为 arg 传递:

func getAndDisplayLocationStringForLocation(currentLocation: CLLocation, withCompletion completion: (string: String?, error?, error: NSError?) -> ()) {
    CLGeocoder().reverseGeocodeLocation(currentLocation, completionHandler: { (placemarks: [AnyObject]!, error: NSError!) in
        if error == nil && placemarks.count > 0 {
            let location = placemarks[0] as CLPlacemark
            completion(string: "\(location.locality) \(location.thoroughfare) \(location.subThoroughfare)", error: nil)

        } else {
            completion(nil, error)
        }
    })
}

然后这样调用:

yourModel.getAndDisplayLocationStringForLocation(someLocation) { (string: String?, error: NSError?) -> () in
    if (error == nil) {
        self.textField.text = string
    }
}

您可能希望以不同的方式处理错误等。这应该足以让您入门。

【讨论】:

  • 我的错,错误来自我的代码的另一部分。非常感谢你!虽然,我不得不问,为什么是这样建造的?我的意思是使用 reverseGeocodeLocation 应该从模型中使用,但 completionHandler 似乎应该从控制器中使用。
  • 我不能代表苹果,但只要需要网络操作,该操作就会以完成块为背景,以避免在不确定的时间内阻塞 UI。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多