2017-02-15 72 views
1

我用2個單元格創建了一個tableview,每個單元格顯示兩個參議員(基於您的位置)。我使用CLGeocoder成功獲取用戶的郵政編碼,然後將該值(字符串類型)放入聲明爲該函數外部的變量中。如何根據用戶的位置更改數據?

理想情況下,我想在類中使用不同的函數,並使用該字符串變量(應該保存用戶的郵政編碼)來創建特定數據。但是,它不起作用!

下面是提取郵政編碼並將其置於var zipCode中的代碼:(注意,當我運行程序時,if條件中的打印功能成功地在終端中輸出郵政編碼)。

let locationManager = CLLocationManager() 

var zipcode: String = "" 

func getTableInfo() { 

    locationManager.delegate = self 
    locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers 
    locationManager.requestWhenInUseAuthorization() 
    locationManager.startMonitoringSignificantLocationChanges() 

    CLGeocoder().reverseGeocodeLocation(locationManager.location!, completionHandler: {(placemarks, error) -> Void in 

     if error != nil { 
      print("Reverse geocoder failed with error" + error!.localizedDescription) 

     } 

     if placemarks!.count > 0 { 
      let pm = placemarks![0] 

      self.zipcode = pm.postalCode! 

      print(self.zipcode) 
     } 

     else { 
      print("Problem with the data received from geocoder") 
     } 
    }) 

} 

我調用這個函數在viewDidLoad(),然後在viewDidLoad()功能,使用if語句,我嘗試使用郵政編碼來改變一個字符串數組。 names[]被聲明爲viewDidLoad()函數正上方的空字符串數組。

if zipcode == "94108" { 
     names[1] = "WORKS!" 
     print(names) 
    } 

由於某種原因,它不打印名稱! (請注意,郵政編碼確實是94108,因爲當我要求打印'郵政編碼'時,94108就是在控制檯上打印的內容)

+0

== 「94108」語句?您確定CLGeocoder函數已完成嗎? – creeperspeak

+0

它在CLGeocoder()函數中成功工作,但問題是當我在程序中稍後打印名稱[]時,名稱[1]不會不包含更新後的元素。 –

+0

正確 - 但'reverseGeocode'是一個異步函數,所以執行時會有一些延遲。如果你在你的'reverseGeocode' func之後立即放置你的if語句,它幾乎肯定仍然是「」,因爲'reverseGeocode'仍然在運行。查看其他答案。 – creeperspeak

回答

2

您getTableInfo方法創建一個完成處理程序,如:

typealias ZipcodeCompletionBlock = (String?) -> Void 

func getTableInfo(completionBlock: @escaping ZipcodeCompletionBlock) { 

    locationManager.delegate = self 
    locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers 
    locationManager.requestWhenInUseAuthorization() 
    locationManager.startMonitoringSignificantLocationChanges() 

    CLGeocoder().reverseGeocodeLocation(locationManager.location!, completionHandler: {(placemarks, error) -> Void in 
     if error != nil { 
      print("Reverse geocoder failed with error" + error!.localizedDescription) 
      completionBlock(nil) 
     } else if placemarks!.count > 0 { 
      let pm = placemarks![0] 
      self.zipcode = pm.postalCode! 
      completionBlock(self.zipcode) 
     } else { 
      print("Problem with the data received from geocoder") 
      completionBlock(nil) 
     } 
    }) 

} 

現在你可以調用這個函數像這裏面viewDidLoad中:你在哪裏執行你的`如果郵政編碼

self.getTableInfo { zipcode in 
    if zipcode == "94108" { 
     self.names[1] = "WORKS!" 
     print(self.names) 
    } 
} 
0

這可能是因爲保存郵政編碼的代碼執行稍微延遲當您的打印代碼運行時,郵編仍然是「」。完成處理程序已到位,因爲它們在函數完成後執行代碼。打印後立即輸入以下代碼(self.zipcode)

if zipcode == "94108" { 
    names[1] = "WORKS!" 
    print(names) 
} 

希望幫助!

+0

因此,現在名稱[]成功地在控制檯上打印新的輸出,但爲什麼只能在getTableInfo()中工作?我怎樣才能讓它在不同的功能中成功打印? –

+0

我會從完成塊內部調用這些函數,這是確保您的郵編已成功設置的唯一方法。 – Trev14