2014-09-16 1 views
0

URL을 받고 단순히 웹 페이지의 HTML을 반환하는 간단한 함수를 만들려고했습니다. NSURLSessionDataTask 그 자체가 작동하는 것처럼 보입니다. 나는 println(data) 일 때 전체 HTML을 볼 수 있습니다. 그러나 func은 초기 값 "# !?"만 반환합니다. DataTask이 비동기식으로 작동한다고 생각합니까?

어떻게 처리 할 수 ​​있습니까?NSURLSessionDataTask : func은 데이터를 받지만 아무 것도 반환하지 않습니다.

func loadHTML(targetURL: String) -> String { 

    var theTargetURL = NSURL(string:targetURL) 
    var theResult = "#!?" 

    var request: NSURLRequest = NSURLRequest(URL:theTargetURL) 
    let config = NSURLSessionConfiguration.defaultSessionConfiguration() 
    let session = NSURLSession(configuration: config) 

    let task : NSURLSessionDataTask = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in 
     println(NSString(data: data, encoding: NSASCIIStringEncoding)) 

     if error != nil { 
      println(error.localizedDescription) 
      theResult = "error" 
     } 
     if data != nil { 
      theResult = NSString(data: data, encoding: NSASCIIStringEncoding) 
      println("RECEIVED\t\t\(countElements(theResult)) CHARS") 
     } 
    }); 
    task.resume() 

    return theResult 
} 
+0

당신은 전에 비동기 프로그래밍을 수행 한 당신의 방법에서 호출? 이것은 비동기 모델이지만 함수는 즉각적으로 반환되어 즉 치값을 반환합니다. 그러나 요청은 URL에서 콘텐츠를로드하고 가져 오는 데 시간이 오래 걸립니다. 함수에서 완료 블록을 사용하면 요청이 완료 될 때 호출되는 것이 더 좋습니다. – Sandeep

+0

왜 비동기가되어야하는지 이해했지만 작동 완료 블록을 얻을 수 없습니다. 'func'의 끝에서'return'을 포기할 수는 없지만'data! = nil {}'내부에서'return theResult'를 호출하면 'String은 Void로 변환 될 수 없습니다'오류가 발생합니다 . 예를 들어 주시겠습니까? – ixany

답변

0

다음은 완료 핸들러를 사용하여 수행하는 예입니다. 이 필요한 곳 ​​

typealias CompletionBlock = (NSData!, NSURLResponse!, NSError!) -> Void 

    func loadHtml(targetUrlString: String, completion: CompletionBlock){ 

    let targetUrl = NSURL(string: targetUrlString) 
    let request = NSURLRequest(URL: targetUrl) 

    let session = NSURLSession.sharedSession() 
    let task = session.dataTaskWithRequest(request, completionHandler: completion) 
    task.resume() 

    } 

다음,

func viewDidLoad(){ 
    super.viewDidLoad() 
    loadHtml("http://google.com", completion: { (responseData: NSData!, response: NSURLResponse!, error: NSError!) -> Void in 

    if responseData != nil{ 

     let resultString = NSString(data: responseData, encoding: NSASCIIStringEncoding) 
     println(resultString) 

     /* 
     do some task or update on the main thread 
     dispatch_async(dispatch_get_main_queue){ 
      myActivityIndicator.stopAnimating() 
     } 
     */ 

    }else if error != nil{ 

     println("Error occurred: \(error.localizedDescription)") 

    } 

    }) 
+0

정말 감사합니다. 완벽하게 작동합니다. – ixany

관련 문제