코드의이 전체 조각 :
completionHandler: { placemarks, error in
guard let addressDict = placemarks?[0].addressDictionary else {
return
}
if let city = addressDict["City"] as? String {
self.currentCity = city
print(city)
}
if let zip = addressDict["ZIP"] as? String {
print(zip)
}
if let country = addressDict["Country"] as? String {
print(country)
}
self.nowUpdateUI()
}
)
가 (모든 것이 완성 된 후 발생)을 completionHandler에서 일어나는 이미 단지 또한 completionHandler 내부 updateUI()
당신을 실행합니다. 그래서 최종 코드는 다음과 같습니다
completionHandler: { placemarks, error in
guard let addressDict = placemarks?[0].addressDictionary else {
return
}
if let city = addressDict["City"] as? String {
self.currentCity = city
DispatchQueue.main.async {
updateUI()
}
}
if let zip = addressDict["ZIP"] as? String {
print(zip)
}
if let country = addressDict["Country"] as? String {
print(country)
}
self.nowUpdateUI()
}
)
당신이 당신의 completionHandler가 backgroundqueue에 있기 때문에 DispatchQueue.main
가 사용해야하는 이유를하지만 당신은 당신은 당신의 mainQueue 이렇게 사용자의 관련 물건을 UI에서 가장 빠른 변화를받을 수 있나요 항상해야 자신의 UI가 이상없이. 상상해보십시오. 백그라운드 스레드에서 작업하고 느린 작업이 있었다고 상상해보십시오. 질문이 있으시면 언제든지 천천히
번으로 문의하십시오. –
그래, 아직 프로그래밍에 익숙하지 않아서, 당신이 제공하는 두 번째 옵션의 구현을 보여줄 수 있습니까? (updateUI()는 뷰 컨트롤러의 메소드이며 getLocationName이 구현 된 Location이 아닙니다.) –
@Mr_Vlasov 따라서 메소드와 함께 completionHandler를 사용하려고합니다. 스위프트 3와 일하고 있습니까? –