Ios 基于用户';什么地方?

Ios 基于用户';什么地方?,ios,swift,location,Ios,Swift,Location,我创建了一个包含2个单元格的tableview,每个单元格显示两位参议员(基于您的位置)。我使用CLGeocoder成功地获取用户的zipcode,然后将该值(类型为string)放入在函数外部声明的变量中 理想情况下,我希望转到类中的另一个函数,并使用该字符串变量(应该包含用户的邮政编码)来创建特定的数据。但是,它不起作用 下面是提取邮政编码并将其放入var zipCode中的代码:(请注意,当我运行程序时,if条件中的print函数成功地在终端中打印邮政编码) 我在viewDidLoad()

我创建了一个包含2个单元格的tableview,每个单元格显示两位参议员(基于您的位置)。我使用CLGeocoder成功地获取用户的zipcode,然后将该值(类型为string)放入在函数外部声明的变量中

理想情况下,我希望转到类中的另一个函数,并使用该字符串变量(应该包含用户的邮政编码)来创建特定的数据。但是,它不起作用

下面是提取邮政编码并将其放入var zipCode中的代码:(请注意,当我运行程序时,if条件中的print函数成功地在终端中打印邮政编码)

我在
viewDidLoad()
中调用此函数,然后在
viewDidLoad()
函数中,使用if语句,尝试使用邮政编码更改字符串数组
names[]
声明为
viewDidLoad()
函数正上方的空字符串数组

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

出于某种原因,它不会打印姓名!(请注意,邮政编码实际上是94108,因为当我要求打印“zipcode”时,94108是在控制台中打印的。)

这可能是因为保存邮政编码的代码执行过程中有一点延迟,所以运行打印代码时zipcode仍然是“”。完成处理程序已经就位,因为它们在函数完成后执行代码。将以下代码放在打印后(self.zipcode)


希望有帮助

为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)
    }
}

如果zipcode==“94108语句,您在哪里执行
?您确定CLGeocoder函数已经完成了吗?当放入CLGeocoder()函数中时,它会成功工作,但问题是,当我稍后在程序中打印names[]时,names[1]不包括更新的元素。对-但是
reverseGeocode
是一个异步函数,因此执行时会有一点延迟。如果将If语句放在
reverseGeocode
函数之后,几乎可以肯定它仍然是““因为
reverseGeocode
仍在运行。请参阅其他答案。现在names[]成功地在控制台上打印了新的输出,但为什么这只能在getTableInfo()中工作?如何使它在不同的函数中成功打印?我将从完成块内部调用这些函数,这是确保zipcode已成功设置的唯一方法。
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)
        }
    })

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