2016-07-05 2 views
1

그래서 Alamofire 요청을하려고합니다. 그런 다음 JSON 데이터에서 필요한 정보를 가져 와서 전역 변수에 저장합니다. 여기에 내 코드가 들어 있습니다.전역 변수 및 Alamofire 관련 문제

기본적으로 다른 Swift 파일에서 variableOne의 데이터에 액세스하려고합니다. 두 개의 Swift 파일을 만들고이 파일 중 하나에서 전역 변수의 값을 편집 한 함수가 있다고 가정 해 봅니다. 전역 변수를 인쇄하려고 시도하면 편집 된 값이 표시됩니다. 그러나 Alamofire를 사용할 때마다 전역 변수를 편집하려고 할 때 다른 Swift 파일은 변경된 값을 보지 못합니다. 따라서 Alamofire 요청 블록 내의 전역 변수를 편집하려고 시도하면 다른 파일에서 변수를 인쇄 할 때마다 변경 사항이 표시되지 않습니다.

누구든지 더 나은 표현 방법을 알고 있다면 수정하십시오.

답변

1

나는 값의 변화가 보이지 않는다고 생각하지만 오히려 비동기 메서드를 다루고 있다는 사실로 인해 문제가 발생한다고 생각합니다. 예를 들어 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) 

이 완료 핸들러 패턴을 사용하여, 우리는 "어떻게 비동기 메소드가 완료되면 알 수 있습니까"문제를 해결한다. 필요한 데이터를 클로저의 매개 변수로 다시 전달함으로써 데이터의 범위를 가능한 좁게 유지하면서 전역의 사용을 줄일 수 있습니다.

명백히 클로저의 매개 변수를 귀하의 경우에 맞는 값으로 변경해야합니다. 그러나 이것으로 기본 아이디어를 보여줍니다.

+0

고마워요! 완벽하게 일했습니다. –