完成处理程序异步

完成处理程序异步

问题描述:

我的完成处理程序有问题。下面是完成处理的功能,位于实用程序文件:完成处理程序异步

func convertGeopointToCity(geopoint: PFGeoPoint, complete: (city: String, error: NSError?) -> Void) { 
    var city = "" 
    let latitude = geopoint.latitude 
    let longitude = geopoint.longitude 
    let location: CLLocation = CLLocation(latitude: latitude, longitude: longitude) 

    CLGeocoder().reverseGeocodeLocation(location, completionHandler: { placemarks, error in 

     if (error == nil) { 

      if let p = CLPlacemark?(placemarks![0]) { 

       if let city = p.locality { 
        city = " \(city)!" 
        print("Here's the city:\(city)") 
        complete(city: city, error: nil) 
       } 
      } 
     } 
    }) 
} 

,我称之为一个视图控制器

LocationUtility.instance.convertGeopointToCity(geopoint, complete: { result, error in 
     if error != nil { 
      print("error converting geopoint") 
     } else { 
      city = result as String 
     } 
    }) 
    print("The city: \(city)") 

输出清楚地表明,该函数不等待运行前完成该块:

The city: 

Here's the hood Toronto! 

如何解决此问题?

+0

按预期工作。工作完成后立即调用完成处理程序。当这项工作完成后,定期的控制流程将继续 - 在你的情况下,这意味着执行了print语句。 –

你应该把你的处理程序块内:

LocationUtility.instance.convertGeopointToCity(geopoint, complete: { result, error in 
    if error != nil { 
     print("error converting geopoint") 
    } else { 
     city = result as String 
     // do other stuff here, or call a method 
     print("The city: \(city)") 
    } 
}) 

CLGeocoder().reverseGeocodeLocation是异步。一旦地理编码完成,就会调用完成块,更有可能在您的打印附加之后。

您应该在完整块调用的另一个函数中执行操作,或者向块本身添加一些代码。