2017-02-15 69 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