2016-07-27 63 views
0

我目前正在創建一個項目,我需要對地址進行地理編碼並將其放入座標。正如你所看到的,我已經在下面做了下面的功能來做到這一點,它的工作原理。但是,該函數返回的變量似乎並未在應用程序的其餘部分中更新。下面是我的代碼。爲什麼在異步函數後值不會更新?

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 & startLong在我的項目,但它似乎沒有我外面被更新調用該函數。當我在函數調用之外調用這兩個變量時,它只返回nil。任何幫助是極大的讚賞。

+3

'forwardGeocodingStarting'異步工作,這意味着完成塊在時間以後調用。只需將兩條「print」行或處理值的代碼放入塊中,就像另一個「print」行一樣。 – vadian

回答

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) 
    } 
} 
+0

我對代碼的底部進行了編輯,嘗試解決您的建議,但這似乎沒有奏效。那是你用if語句表達的意思嗎? –

+0

你應該檢查蘋果文件的可選解除綁定[這裏](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html) –

相關問題