从Swift

时间:2015-06-26 03:51:51

标签: ios swift core-location

我想用其他逻辑将geocoder.geocdeAddressString包装在另一个方法中。

public func placemarkForSearchResult<T>(searchResult: T) -> CLPlacemark? {
        if let searchResult = searchResult as? String {
            let geocoder = CLGeocoder()
            geocoder.geocodeAddressString(searchResult, completionHandler: {
                (placemarks, error) -> Void in

                // Check for returned placemarks
                if let placemarks = placemarks where placemarks.count > 0 {
                    return placemarks[0] as! CLPlacemark // CLPlacemark is not convertible to void error message
                }
                return nil // Typd Void does not conform to protocol NilLiteralConvertible
            })
        }
    }

我在这个方法中有一些其他逻辑并不是真正相关,但我想知道如何处理这样的情况,我想返回一个CLPlacemark,但不能因为地理编码器的completionHandler返回Void。我无法更改地理编码器回调的Void参数。那可能吗?或者我是否一直在调用使用地理编码器中找到的CLPlacemark的委托方法?提前致谢。

1 个答案:

答案 0 :(得分:6)

您永远不能从placemarkForSearchResult函数返回地标,因为获取地标需要使用异步函数(geocodeAddressString)。到那个时候该函数已经完成并回调到你的完成处理程序,你的placemarkForSearchResult已经完成并且很久以前就已经返回了!

您需要一个与您正在调用的函数的异步特性兼容的策略。您需要placemarkForSearchResult 接受回调函数参数,而不是从placemarkForSearchResult返回地标。当您在完成处理程序中有地标时,调用该回调函数。如果该回调函数(巧妙地)设计为接受地标参数,那么您现在将该地标交给任何一个打电话给您的人。