2015-01-31 2 views
0

나는 많은 방법을 시도해보고 stackoverflow와 검색을 하지만 나는 내가 원하는 것을 얻을 수있는 행운이 없다.iOS의 여러 위치에서 응답 사용

간단히 말해 나는 API를 요청한 응답을 변수 에 저장하여 자유롭게 사용할 수 있습니다.

여기에 코드

import UIKit 

class ViewController: UIViewController { 

@IBOutlet weak var responseLabel: UILabel! 
let apiUrlStr = "http://jsonplaceholder.typicode.com/posts" 

var resData = NSArray() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    request(.GET, apiUrlStr, encoding: .JSON).responseJSON { (_, _, JSON, _) in 
     let arr = JSON as NSArray 
     let user = arr[0] as NSDictionary 
     self.responseLabel.text = user.objectForKey("title") as? String 

     self.resData = JSON as NSArray //i cant get this from outside 
    } 

    println(resData) //prints nothing but empty parentheses while inside the request it prints the data right 
    } 
} 

내가 여러 클래스가 모든 클래스가 나는 응답을 반환하는 응답 방법과 API를 클래스를 만들려면 다른 방법으로 응답을 처리해야하기 때문이다. 이 아마도 같은

뭔가 :

class api{ 
    func req(url: String, params: NSDictionary){ 
     //method goes here 
    } 

    func res() -> NSDictionary{ 
     //method goes here 
     var response = NSDictionary() 
     return response 
    } 
} 
다음

의 viewDidLoad

let params = ["aaa","bbb"] 
let api = api() 
api.req(apiUrlStr, params) 
let res = api.res() 

이 같이 사용할 수 *** 내가 지금 사용하고 요청 방법은 Alamofire.swift에서이다 그런데 나는 다른 방법을 사용하여 마음을 먹지 않는다.

여기는 행운을 따라 가려고했던 게시물과 사이트의 일부이다.

,515,

proper-way-to-pull-json-api-resoponse

link2

방법만을 내부에서 동일한 결과 응답의 모든 리드.

답변

1

문제는 alamofire를 사용하는 것처럼 보이는 네트워크에 대한 호출이 비동기라는 점입니다. 따라서 네트워크 요청이 시작되고 완료되기 전에 귀하의

println(resData) 

행이 실행됩니다. 이 시점에서 네트워크의 응답은 반환되지 않으므로 resData는 여전히 빈 배열입니다.

대신이 일을보십시오 :

는 응답 코드에 그런 새로운 기능

func handleResponse(resData: NSArray) { 
    self.resData = resData 
    println(resData) 
} 

를 추가, 교체

let resData = JSON as NSArray 
self.handleResponse(resData) 

self.resData = JSON as NSArray 

더 그쪽이 필요한 가정 데이터가로드 될 때 변경되는 println 문만 있으면이 메서드에서 데이터 소스를 다시로드하기 위해 테이블 ​​뷰 또는 기타 UI 구성 요소에 정보를 제공해야합니다.

+0

이 솔루션은 여전히 ​​내 문제를 해결하지 못했습니다. 응답 코드 내에서 (handleResponse)가 호출되었지만 viewdidload에서 액세스 할 때 (self.resData) 여전히 비어 있기 때문에 여전히 다른 함수의 응답에 액세스 할 수 없습니다. – iEmad

+0

더 구체적으로 어떻게 데이터를 반환 한 후 println (resData)을 호출 할 수 있습니까? – iEmad

+1

설명 된대로 데이터가 반환 된 후에 println (resData)을 호출 할 수 있습니다. 서버가 응답하기를 기다리는 동안 모든 프로그램 실행을 차단하지 않으면 viewDidLoad 메서드에서이 작업을 수행 할 수 없습니다.이것은 나쁜 생각입니다 (예 : 서버가 느린 네트워크 연결을 통해 응답하는 데 오랜 시간이 걸릴 수 있음). https://github.com/Alamofire/Alamofire#response-handling을 읽고 비동기 프로그래밍에 대해 읽어 보시기 바랍니다. – pauln