2017-04-14 7 views
0

는 나는있는 NSDictionary를 반환하는 콜백 기능을 가지고 :얻기 값은

override func viewDidLoad() 
{ 
    super.viewDidLoad() 


    var nd: NSDictionary = [:] 
    parseJSON(callback: {dict in 
     nd = dict 
     //print(nd)  This one prints the filled dictionary correctly 
    }) 
    //print(nd)  This one prints an empty dictionary 

} 

나는 값이 "차"의 콜백 함수에서 반환 저장할하지만 콜백 외부 인쇄 문 여전히 비어있는 NSDictionary를 인쇄 중입니다.

여기서 내가 뭘 잘못하고 있으며 어떻게 해결할 수 있습니까?

편집 :

var nd: NSDictionary! = nil 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 
     loadData() 
     print(self.nd) 
    } 

    func loadData() 
    { 
     parseJSON(callback: {dict in 
      self.nd = dict 
      print(self.nd) 
     }) 
    } 

나는이로 변경 때문에 함수는 다음의로드 및 인쇄를 완료합니다. 그러나 viewDidLoad()의 print 문은 loadData()에있는 print 문보다 먼저 인쇄되고 viewDidLoad()의 print 문은 여전히 ​​nil을 인쇄합니다. 왜 이런 일이 일어나고 특별히 변경할 필요가 있습니까?

+0

이 글타래에 대한 내 답변보기 : http://stackoverflow.com/questions/41209804/waiting-for-asynchronous-function-call-to-complete/41209941#41209941. –

+0

parseJSON()은 비동기 함수입니다. 당신이 요청한 작업이 완료되기 전에 즉시 반환됩니다. 작업이 끝나면 전달 된 콜백을 호출합니다. 콜백 함수의 중괄호 안에 데이터를 가져올 코드를 넣어야합니다. –

+0

@DuncanC 정보를 제공해 주셔서 감사합니다. 내 편집을 참조하십시오. 설명해 주시겠습니까? –

답변

0

parseJSON은 백그라운드에서 실행되며viewDidLoad 메서드가 끝난 후 만 완료 할 수 있습니다. 따라서 nd은 통화 직후 비어있게됩니다.

내 제안 (가변 밖에서 viewDidLoad 방법으로 그 결과를 다음과 복사) 내부에 상기 콜백하여 사전 처리 로직을 추가 .

+0

그래서 viewDidLoad 메서드 외부에서 "nd"를 초기화하고 다른 메서드에서 외부에 액세스해야합니까? 어떻게 해결할 수 있습니까? –

+0

그렇게 할 수는 있지만 정확한 타이밍은 옳다는 것은 까다로울 수 있습니다. 가장 좋은 방법은 실제 콜백 내부에 논리를 추가하는 것입니다. –

+0

감사합니다. 콜백 내에서 로직을 만들 수는 있지만 콜백 함수 외부에서 데이터를 가져올 수 있습니까 (호기심에서 벗어난 것)? –