2014-11-10 2 views
3

저는 Alamofire를 사용하고 있으며 응답을 받으면 어디서나 액세스 할 수있는 변수로 설정하려고합니다. 여기에 .... 어떤 아이디어를 내가글로벌 응답에 액세스하려고 시도합니다.

var data: NSData? 
Alamofire.request(.POST, "http://localhost/api/notifications", parameters: parameters) 
    .responseJSON { (request, response, JSON, error) in 
      let data: AnyObject? = JSON 
    } 
println(data) 

을 가고있어 그리고 내가 nil 얻을 실행할 때 무엇인가? 변수에 할당하지 않을 때 범위 내의 응답을 볼 수 있기 때문에 요청이 좋다는 것을 알고 있습니다.

답변

6

Almofire.request 비동기 기능입니다. 당신은 그것을 부르면 즉시 돌아올 것입니다. 실제로 요청을하기 전에 따라서 println(data)이 호출되기 전에 을 nil으로 설정하기 전에 호출됩니다. 요청이 실제로 완료되면 그 폐쇄가 실제로 data를 사용하려면 볼 수있는 곳입니다 (그것을 인쇄 또는 무엇이든)에서, Alamofire, 당신은 responseJSON에 전달 폐쇄를 호출합니다 :에서

Alamofire.request(.POST, "http://localhost/api/notifications", parameters: parameters) 
    .responseJSON { (request, response, JSON, error) in 
     let data: AnyObject? = JSON 
     // do something useful with data 
     println(data) 
    } 

질문 덧글 :

하지만 그 데이터를 표로 바꾸고 싶다고 말하면됩니다. 클로저에 모든 테이블 코드를 넣을 수 있습니까?

당신 폐쇄 내부의 모든 코드를 넣을 수 있지만, 아마 꽤 빨리 혼란스러워 할 것이다. 이를 처리하는 더 좋은 방법은 Alamofire.request이 사용하는 것과 같은 종류의 패턴을 구현하는 것입니다. 기본적으로 자신의 함수가 클로저를 매개 변수로 사용하도록 요청합니다. 그런 다음 닫음에서 responseJSON으로 전달하고 함수에 전달 된 클로저를 호출하여 data을 전달합니다. 그런 다음 "데이터를 표로 바꾸기"위한 별도의 기능을 만들고 클로저에서 data으로 호출하십시오. 이런 식으로 뭔가 :

func callSomeAPI(resultHandler: (data: AnyObject?) ->()) ->() { 
    Alamofire.request(.POST, "http://localhost/api/notifications", parameters: parameters) 
     .responseJSON { (request, response, JSON, error) in 
      let data: AnyObject? = JSON 
      resultHandler(data) 
    } 
} 

func makeTable(data: AnyObject?) ->() { 
    // make your table 
} 

callSomeAPI() { data in 
    makeTable(data) 
} 

참고 : 당신은 아마 거기에 어떤 점에서 AnyObject? 이외의 다른 data을 변환 할 수 있습니다.

+0

그렇다면'.responseJSON' 이외의'data' 상수에 접근 할 수 없다는 말입니까? ... – user302975

+0

실제로 액세스 할 수 없다는 것은 아닙니다. 설정되지 않을 것입니다. 'responseJSON'에 전달 된 클로저가 호출 될 때까지. 요청은 비동기 적으로 이루어 지므로 현재 '데이터'는 호출하려고 할 때 설정되지 않습니다.설정 후에 '데이터'(인쇄 이외의 다른 작업)로하고 싶은 작업에 대해 더 많이 알고 있다면 올바른 방향으로 안내 할 수 있습니다. –

+0

'data'는 JSON 응답입니다. 나는 JSON을 가져 와서 그것을 "예쁜"것으로 만들고 싶다. 'Name : Bob','Age : 22'와 비슷합니다. '{-data : [Name : Bob, Age : "22"]}'이해합니까? – user302975

-1

let data: AnyObject? = JSON을 할 때 클로저에 새 로컬 변수 data을 만들었 기 때문입니다.

대신이 작업을 수행해야합니다

var data: NSData? 
Alamofire.request(.POST, "http://localhost/api/notifications", parameters: parameters) 
    .responseJSON { (request, response, JSON, error) in 
      data = JSON 
    } 
println(data) 
+3

이렇게하면 'nil'이 인쇄되지만 다른 이유가 있습니다. –

+0

'data = JSON as? NSData'와 인쇄 할 때 여전히'nil'을 얻고 그 뒤에'(lldb)'를 붙인다. @AaronBrager – user302975

+0

예, 인쇄하려고 할 때까지 데이터를받지 못했기 때문이다. –

관련 문제