2014-07-24 3 views
1

iOS 개발을 처음 사용합니다. 나는 스위프트를 사용하고 있으며 Objective-C에 대한 경험이 거의 없기 때문에 아마도 다른 관련 답변 중 일부는 이해하기 까다 롭습니다. NSURLSession을 사용하여 웹에서 JSON 파일의 일부 데이터를 가져 오는 방법을 이해하려고합니다. URL에서 파일을 가져 오는 것에 대한 유용한 정보를 찾았지만이 다른 StackOverflow 사용자 (NSURLSessionDataTask dataTaskWithURL completion handler not getting called)처럼 NSURLConnection은 데이터를 가져 오는 현재 방법이 아니므로 NSURLSession을 사용하려고합니다.NSURLSession을 사용할 때 데이터에 어떻게 액세스합니까?

static func loadJSONFromBundle(filename: String) -> Dictionary<String, AnyObject>? { 
    let path = NSBundle.mainBundle().pathForResource(filename, ofType: ".json") 
    if !path { 
     println("Could not find level file: \(filename)") 
     return nil 
    } 
    var error: NSError? 
    let data: NSData? = NSData(contentsOfFile: path, options: NSDataReadingOptions(), 
     error: &error) 
    if !data { 
     println("Could not load level file: \(filename), error: \(error!)") 
     return nil 
    } 
    let dictionary: AnyObject! = NSJSONSerialization.JSONObjectWithData(data, 
     options: NSJSONReadingOptions(), error: &error) 
    if !dictionary { 
     println("Level file '\(filename)' is not valid JSON: \(error!)") 
     return nil 
    } 
    return dictionary as? Dictionary<String, AnyObject> 
} 

내가 뭔가를하고 싶습니다 : 나는 번들에서 내 JSON을 얻고 때

, 나는 (내가 튜토리얼에서이 코드를 가지고 확신) 사전에이 확장을 사용하고 있습니다 내 JSON 파일을 번들에 모두 포함시키고 싶지 않기 때문에 웹에있는 JSON 파일에서 사전을 가져 오는 것과 비슷합니다. 지금까지, 나는이 있습니다

static func loadJSONFromWeb(urlstring: String) -> Dictionary<String, AnyObject>? { 

    let url = NSURL(string: urlstring) 
    let config = NSURLSessionConfiguration.defaultSessionConfiguration() 
    let session = NSURLSession(configuration: config, delegate: nil, delegateQueue: NSOperationQueue()) 

    var error: NSError? 
    //I think I am using the completionHandler incorrectly. I'd like to access the data from the download 
    let task = session.downloadTaskWithRequest(NSURLRequest(URL: url), {(url, response, error) in println("The response is: \(response)") 
     }) 
    task.resume() 

    //Isn't this contentsOfURL thing supposed to go with the connection stuff rather than the session stuff? 
    //How can I do this with a session? How can I create and use a completionHandler? This way seems clunky. 
    let data: NSData? = NSData(contentsOfURL: url) 
    if !data { 
     println("Could not load data from file: \(url), error: \(error!)") 
     return nil 
    } 
    println("The data is: \(data)") 

    let dictionary: AnyObject! = NSJSONSerialization.JSONObjectWithData(data, 
     options: NSJSONReadingOptions(), error: &error) 
    if !dictionary { 
     println("The file at '\(url)' is not valid JSON, error: \(error!)") 
     return nil 
    } 

    return dictionary as? Dictionary<String, AnyObject> 
} 

나는 대부분의 응답을 필요로 내 실제 질문이 있다고 생각 : 데이터 를 어디? 세션 및 작업을 올바르게 사용하고 있다고 생각하지 않습니다. 내가 특정 URL에 연결하기 위해 세션을 시작하고 resume()에서 까지 다운로드 작업을 시작하는 것처럼 느껴진다. 그러나 나는 어떻게 해야할지 모르겠다. JSON 파일에서 데이터를 가져온다. 나는 completionHandler 내가 여기 것과 유사한 방식으로 요청을 사용해야하는 경우

는 다음 completionHandler의 '데이터'나는 애 쓰고 저런의 데이터와 관련이 있는지 은 (popViewControllerAnimated work slow inside NSURLSessionDataTask는) 누군가가 설명해주십시오 수 있습니다 읽거나 다운로드 하시겠습니까? 나는 다소 completionHandler에 당황스럽고 그것을 올바르게 사용하는 법을 알고있다.

NSData에 대한 설명서도 살펴 보았지만 내 세션에서 데이터를 가져 오는 방법 (또는 내 세션에서 NSData 인스턴스를 초기화하는 방법)을 이해하는 데 도움이되는 내용을 보지 못했습니다. 지금까지 양식에 NSURLDownloadTask에 대한 문서를 말할 수있는만큼 작업 자체는 데이터에 액세스 할 수있는 방법이 아닙니다. 데이터는 completionHandler을 통해 세션 및 작업에서 온 것 같습니다.


편집 : 가 나는 또한 NSURLSessionDownloadDelegate에 대한 문서 보았다,하지만 난 정말 대리자를 사용하는 방법에 대한 설명과 함께 스위프트의 예를 사용할 수 있습니다. URL 로딩 시스템 프로그래밍 가이드로 안내했습니다. 나는이 문서가 복잡하다면 세션 사용의 이점이 엄청나다는 것을 짐작하고있다. URL 로딩 시스템에 대한 자세한 정보를 계속 찾아 보겠습니다.

나는이 답변이 도움이된다는 것을 발견했다. (나는 아직 너무 새로 워서 아직 아무것도 업 그레이션 할 수 없다) : https://stackoverflow.com/a/22177659/3842582 그것은 내가 대리인을 사용하는 법을 배워야 할 필요가 있음을 알게 해 주었다.

URL 로딩 시스템 프로그래밍 가이드도 보았습니다. 내가 정말로 필요로하는 것은 완공에 도움이된다고 생각한다 .Handler. 데이터를 얻으려면 어떻게해야합니까? 또는 나는 이미 내가 NSData(contentsOfURL: url)을 사용하여 올바르게하고있다 (왜냐하면 나는 생각하지 않기 때문이다).


제공 할 수있는 도움에 미리 감사드립니다.

답변

0

먼저 데이터 : NSData?= NSData (contentsOfURL : url) JSON을 동 기적으로 반환합니다. 이것을 시도하고 간단하게 작동 시키셨습니까? 그렇게하면 NSURLSession을 파악하면서 나머지 처리 작업을 시작할 수 있습니다.

NSURLSession 또는 iOS의 다른 많은 기능을 사용하려면 위임자를 알아야합니다. 다행히도 쉽습니다. 구문에 관해서는 클래스 선언을 상속받은 것처럼 클래스 선언에 추가하면됩니다. 이는 최소한 위임자에게 필요한 기능을 구현할 것이라고 말합니다. 콜백 함수는 일반적으로 꽤 잘 설명되어 있습니다. 일단 이해하면 아주 간단합니다.

정말 NSURLSession이 필요한 "중량"프로젝트가 아니라면이 Swift 라이브러리를 살펴 봐야합니다. JSON을 다루는 정말 좋은 방법 일뿐만 아니라 url에서 JSON을 직접로드하는 동시 호출이 있습니다. https://github.com/dankogai/swift-json/

+0

거기에'let data = NSData (contentsOfURL : url)'이 있는데, NSURLSession의 적절한 사용으로 대체하려고합니다. 이것은 현재 URL의 데이터를 볼 수있게 할 것이지만이 기회를 사용하여 대리자 (또는 completionHandler에 대해)에 대해 자세히 알아야한다고 생각했습니다. 헤비급 프로젝트에서 동기식으로 내 데이터를 전달할 때의 위험은 무엇입니까? 나는 아마 안전한 접근법을 사용해야한다. 델리게이트에 대해 더 많은 것을 배우기위한 유용한 자료를 생각해 낼 수 있습니까? 유용한 자습서 또는 알고있는 답변이 있습니까? 당신의 도움을 주셔서 감사합니다! – PrairieProf

+0

신속한 리소스 : http://www.raywenderlich.com/75289/swift-tutorial-part-3-tuples-protocols-delegates-table-views – hcanfly

+0

및 objective C 튜토리얼 : http://www.tutorialspot.com/objective_c /objective_c_protocols.htm – hcanfly

0

NSURLConnection이 데이터를 가져 오는 올바른 방법이 아닌 이유는 무엇입니까? 동기 요청에주의해야합니다. 다음은 URL에서 데이터를 가져 오는 방법의 예입니다.

func synchronousExampleRequest() -> NSDictionary { 

      //creating the request 
      let url: NSURL! = NSURL(string: "http://exampledomain/apiexample.json") 
      var request = NSMutableURLRequest(URL: url) 
      request.HTTPMethod = "GET" 
      request.addValue("application/json", forHTTPHeaderField: "Content-Type") 


      var error: NSError? 

      var response: NSURLResponse? 

      let data = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &error) 

      error = nil 
      let resultDictionary: NSDictionary = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers, error: &error) as! NSDictionary 

      return resultDictionary 
     } 
관련 문제