나는 값의 변화가 보이지 않는다고 생각하지만 오히려 비동기 메서드를 다루고 있다는 사실로 인해 문제가 발생한다고 생각합니다. 예를 들어 function
에 전화하면 즉시 반환되지만 variableOne
은 즉시 업데이트되지 않고 오히려 나중에 업데이트 될 수 있습니다. 이 비동기 응답 클로저를 호출하기 전에 확인하고있을 것입니다.
이 "전역"(어쨌든 나쁜 아이디어 임)을 사용하는 대신 사용자가 직접 완성 처리자 패턴을 채택하면이 문제가 발생하지 않습니다.
func function(completionHandler: (String?) ->()) {
Alamofire.request(.GET, "API URL").responseJSON { response in
if let rawJSON = response.result.value {
// Here I just take the JSON and put it into dictionaries and parse the data.
completionHandler(String("data"))
} else {
completionHandler(nil)
}
}
}
당신과 같이이 전화 것 :
function() { string in
// use `string` here
}
// but not here, because the above closure runs asynchronously (i.e. later)
이 완료 핸들러 패턴을 사용하여, 우리는 "어떻게 비동기 메소드가 완료되면 알 수 있습니까"문제를 해결한다. 필요한 데이터를 클로저의 매개 변수로 다시 전달함으로써 데이터의 범위를 가능한 좁게 유지하면서 전역의 사용을 줄일 수 있습니다.
명백히 클로저의 매개 변수를 귀하의 경우에 맞는 값으로 변경해야합니다. 그러나 이것으로 기본 아이디어를 보여줍니다.
출처
2016-07-05 15:35:03
Rob
고마워요! 완벽하게 일했습니다. –