2016-07-14 2 views
1

나는 다음과 같은 코드가 있습니다IOS가있는 NSURLConnection 스위프트 취소

사용자에게 이미지의 슬라이드 쇼를 표시 할 때이 백그라운드에서 실행
func getStoryContent(cityID : String, completionHandler: (loaded: Bool, dataNil: Bool) ->()) ->() { 
    let scriptUrl = "***" 
    var user_id = "nil" 
    if let userID = NSUserDefaults.standardUserDefaults().stringForKey("userId") { 
     user_id = userID 
    } 
    var params = *** 
    let myUrl = NSURL(string: scriptUrl); 
    let request: NSMutableURLRequest = NSMutableURLRequest(URL: myUrl!) 
    request.HTTPMethod = "POST" 
    let data = params.dataUsingEncoding(NSUTF8StringEncoding) 
    request.timeoutInterval = 10 
    request.HTTPBody=data 
    request.HTTPShouldHandleCookies=false 
    let queue:NSOperationQueue = NSOperationQueue() 
    NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in 
     do { 
      ....code..... 

, 그것은 기본적으로 표시 할 더 많은 이미지를 다운로드하고 배열로 추가를 이미지. 문제는 사용자가 언제든지 슬라이드 쇼를 종료 할 수 있다는 것입니다.이 경우 취소해야합니다. NSURLConnection. 사용자가 슬라이드 쇼를 종료하려고 할 때 실행되는 함수가 있지만이 연결을 제대로 취소하기 위해 어떤 코드를 추가해야하는지 잘 모르겠습니다.

답변

5

NSURLConnectionsendAsynchronousRequest은 (는) 취소 가능한 요청이 아닙니다. 그러나 NSURLConnection은 사용되지 않으며 NSURLSession을 사용해야합니다. 그리고 NSURLSessiondataTask은 취소 가능합니다.

그래서, 대신 :

NSURLConnection.sendAsynchronousRequest(request, queue: queue) { response, data, error in 
    do { 
     ....code..... 
    } 
} 

당신은 사용할 수 있습니다 : 당신이 그것을 취소해야하는 경우,

let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in 
    do { 
     ....code..... 
    } 
} 
task.resume() 

을, 당신은 task.cancel() 할 수 있습니다.

+0

그래도 완료 핸들러를 사용할 수 있습니다. 코드의 필수 부분입니다. – Alk

+1

예, 위에서 설명한대로입니다. 매개 변수의 순서는 '데이터'를 먼저 사용하여 다릅니다. 하지만 그 외에도 매우 유사합니다. 큐에 관해서는,'sharedSession'은 디폴트로 시리얼 백그라운드 큐로 설정되어 있습니다. (자신 만의 큐를 지정하고 싶다면'NSURLSessionConfiguration'을 사용하여 자신의'NSURLSession'을 인스턴스화 할 수 있습니다). 하지만 기본 백그라운드 대기열은 괜찮을 것입니다. – Rob