Google의 장소 API를 사용하여 API 요청을 수행하는 기능이 있습니다. API 응답 데이터에서 값을 캡처하여 변수로 설정하려고합니다. 이 함수는 다른 함수 내부에서 호출됩니다. 그런 다음 그 변수에 액세스하려고 시도하지만 불행히도 변수에는 아직 값이 포함되어 있지 않습니다. 이것은 스레딩 문제인 것으로 보이지만이를 수정하는 방법을 모르겠습니다.API에서 가능한 신속한 스레딩 문제
업데이트 : 응답을 기반으로 코드를 업데이트했습니다. 불행히도 나는 여전히 API 요청의 값으로 변수에 액세스 할 수 없습니다. 완성 처리기를 사용하는 api 요청을 수행하는 함수를 다시 작성했습니다. mapView (mapView : GMSMapView!, didTapInfoWindowOfMarker marker : GMSMarker!)는 Google지도 프레임 워크의 함수입니다. 완료 처리기를 사용하려면 이것을 다시 작성해야합니까? API 요청과
가 // 변수
var website = ""
// 코드
func getWebsite2(id: String, completion: (result: String) -> Void) {
var url = NSURL(string: "https://maps.googleapis.com/maps/api/place/details/json?placeid=\(id)&key=AIzaSyAWV1BUFv_vcedYroVrY7DWYuIxcHaqrv0")
self.dataTask = defaultSession.dataTaskWithURL(url!) {
data, respnse, error in
let json : AnyObject
do {
json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments)
var dictionArr = json["result"]
self.website = dictionArr!!["website"] as! String
print(self.website)
}
catch {
print(error)
}
}
self.dataTask?.resume()
}
// 번째 함수
func mapView(mapView: GMSMapView!, didTapInfoWindowOfMarker marker: GMSMarker!) {
let storeMarker = marker as! PlaceMarker
self.getWebsite2(storeMarker.id!) {
(result: String) in
print("inside did tap")
print(self.website)
// problem still here
// above two lines of code never run
}
self.performSegueWithIdentifier("toWebView", sender: nil)
}
// I는 defaultSession 및 dataTask 이렇게 초기화.
let defaultSession = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
var dataTask: NSURLSessionDataTask?
네트워크 요청은 비동기식이므로 나머지 코드는 네트워크 요청이 완료되기 전에 실행됩니다. 'defaultSession.dataTaskWithURL'가 완성 블록을 넘겨주는 것과 같은 방식으로 completion 블록을 취하기 위해'getWebsite2' 함수를 작성해야합니다. –
응답을 위해 Oleg와 감사합니다. 나는 현재 당신과 Oleg의 제안을 따르고 있으며 완료 핸들러를 사용하려고합니다. 알아 내면 업데이트를 게시 할 것입니다. – ray
snipplet에서'defaultSession'이 초기화되는 방법이 명확하지 않습니다. 'NSURLSession.shared()'에 대한 로컬 참조라고 가정하면이 코드는 다른 스레드에서 실행되어 데이터 경합을 유발합니다. 'self.website = ...'를'dispatch_async (dispatch_get_main_queue()) {...} '클로저로 감쌀 필요가 있습니다. – user2378197