为什么异步函数后值不会更新?

时间:2016-07-27 16:32:02

标签: ios swift asynchronous

我目前正在创建一个项目,我需要对地址进行地理编码并将其放入坐标中。正如你所看到的,我已经在下面做了以下功能来做到这一点,它的工作原理。但是,在此函数中返回的变量似乎不会在应用程序的其余部分更新。以下是我的代码。

var startLat: Double!
var startLong: Double!

typealias theDouble = (Double, Double) -> ()  

func forwardGeocodingStarting(address: String, completion: theDouble){
   //your code
   let aVar: Double!
   let bVar: Double!

   let placemark = placemarks?[0]
   let location = placemark?.location
   let coordinate = location?.coordinate
   aVar = (coordinate?.latitude)!
   bVar = (coordinate?.longitude)!
   completion(aVar, bVar)
}

// CALL THIS FUNCTION 

forwardGeocodingStarting(<your string address>) { firstVar, secondVar in

   startLat = firstVar
   startLong = secondVar
   print("\(startLat) is lat and \(startLong) is long") //GET CORRECT VALUES
}

print(startLat) // GET "NIL"
print(startLong) // GET "NIL"



// ================= EDIT ==============

            if startLat != 0 {
            let startLatUnwrapped: Double = startLat
        }

        if startLong != 0 {
            let startLongUnwrapped: Double = startLong
        }

我需要做的是使用startLat&amp; startLong在我的整个项目中,但似乎没有在我之外更新调用函数。当我在函数调用之外调用这两个变量时,它只返回nil。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

异步块立即返回控制。所以,当你打电话

print(startLat)

在异步块之后,它将不包含更新的值(在这种情况下,它包含nil)。我不建议在异步块之后立即使用变量,而是建议创建一个方法,对变量执行所需的工作,并在异步闭包结束时调用它。

另一种安全使用变量的方法是检查它们是否为零。你可以使用

if let

安全地展开变量。

希望这有帮助。

修改

这就是我的意思:

forwardGeocodingStarting(<your string address>) { firstVar, secondVar in

    startLat = firstVar
    startLong = secondVar
    print("\(startLat) is lat and \(startLong) is long") //GET CORRECT VALUES

    self.unwrapAndPrintCoordinates()
}

//Now, if anywhere in your code, you want to check if startLat and startLong 
//have values, you call this method

func unwrapAndPrintCoordinates() {

    //Unwrap startLat
    if let startLatUnwrapped = startLat {
        print(startLatUnwrapped)
    }

    //Unwrap startLong
    if let startLongUnwrapped = startLong {
        print(startLongUnwrapped)
    }
}