如何在执行块后返回值?迅速

时间:2015-11-04 15:34:13

标签: ios swift swift2

我想从函数中获取值。有功能块。当块执行时,该函数已经返回该值。我尝试了很多不同的方法,但他们没有帮助我。我使用了NSOperation和Dispatch。该函数始终返回值,直到执行块为止。

   var superPlace: MKPlacemark!

 func returnPlaceMarkInfo(coordinate: CLLocationCoordinate2D) -> MKPlacemark? {
    let location = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)
    geocoder.reverseGeocodeLocation(location) { (arrayPlaceMark, error) -> Void in
            if error == nil {
                let firstPlace = arrayPlaceMark!.first!
                let addressDictionaryPass = firstPlace.addressDictionary as! [String : AnyObject]

                self.superPlace = MKPlacemark(coordinate: location.coordinate, addressDictionary: addressDictionaryPass)
            }
        }

    return superPlace
}

2 个答案:

答案 0 :(得分:2)

您不能简单地返回此处,因为reverseGeocodeLocation函数是异步运行的,因此您需要使用自己的完成块:

divs

答案 1 :(得分:1)

一遍又一遍地出现。简短的回答是“你做不到。”

函数返回时结果不可用。异步调用发生在后台。

您要做的是重构returnPlacemarkInfo函数以完成关闭。

我最近一直在Objective-C工作,所以我的Swift有点生疏,但它可能看起来像这样:

 func fetchPlaceMarkInfo(
  coordinate: CLLocationCoordinate2D, 
  completion: (thePlacemark: MKPlacemark?) -> () )
 {
 }

然后当你调用它时,传入一个完成闭包,一旦地标可用就会被调用。

编辑:

我写了一个演示项目并将其发布在Github上,模拟处理异步网络下载。看看

https://github.com/DuncanMC/SwiftCompletionHandlers

具体看一下方法asyncFetchImage(),它几​​乎就是我们所说的:在内部使用异步方法,并在异步加载完成后接受它调用的完成块。