2015-11-04 168 views
0

我的完成處理程序有問題。下面是完成處理的功能,位於實用程序文件:完成處理程序異步

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語句。 –

回答

0

你應該把你的處理程序塊內:

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是異步。一旦地理編碼完成,就會調用完成塊,更有可能在您的打印附加之後。

您應該在完整塊調用的另一個函數中執行操作,或者向塊本身添加一些代碼。

相關問題