2016-02-27 2 views
0

У меня есть класс MySession, который я вызываю, чтобы получить URL-адрес перенаправления веб-сайта. В моем ViewController я хотел бы отменить сеанс, когда пользователь перейдет из ViewController через ViewDidDisappear. Я знаю, что NSURLSessionTasks имеют метод .cancel, но я не могу придумать, как это сделать. Я мог бы сохранить текущую задачу в Синглтоне, но думал, что должен быть лучший способ?Как отменить NSURLSession из другого класса в Swift?

class MySession: NSObject, NSURLSessionDelegate { 


    func URLSession(session: NSURLSession, task: NSURLSessionTask, willPerformHTTPRedirection response: NSHTTPURLResponse, newRequest request: NSURLRequest, completionHandler: (NSURLRequest!) -> Void) { 



    } 



    // fetch data from URL with NSURLSession 
    class func getDataFromServerWithSuccess(myURL: String, noRedirect: Bool, callback: Result<String> -> Void) { 

     var loadDataTask: NSURLSessionDataTask? = nil 
     let sessionConfig: NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration() 

     //MARK: Toggle timeout on tests 
     sessionConfig.timeoutIntervalForRequest = 60.0 
     sessionConfig.timeoutIntervalForResource = 60.0 



     var myDelegate: MySession? = nil 
     if noRedirect { 
      myDelegate = MySession() 
     } 

     let session = NSURLSession(configuration: sessionConfig, delegate: myDelegate, delegateQueue: nil) 
     loadDataTask = session.dataTaskWithURL(NSURL(string: myURL)!) { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in 


       if let checkedData = data { 

       let success = Result.Success(NSString(data: checkedData, encoding: NSASCIIStringEncoding) as! String) 


       callback(success) 

       } else { 

        let error = NetworkError.FailedUrl("\(myURL) + \(error)") 


        if let request = loadDataTask?.currentRequest { 

         guard let urlExtension = request.URL?.pathExtension else {return} 
         guard let domain = request.URL?.host else {return} 



          guard let finalURLAsString = request.URL?.description else {return} 
          let failure = Result.Failure("\(finalURLAsString) + \(error)") 
          callback(failure) 

         } 

        } 

       } 
     } 
     loadDataTask!.resume() 


    } 


class MyViewController: UIViewController { 

    override func viewDidDisappear(animated: Bool) { 
     //TODO: How to stop MySession task? 




       MySession.getRedirectionInfo(urlAsString) 

       MySession.getDataFromServerWithSuccess(urlAsString, noRedirect: false) { result in 

      //omitted for brevity 
     } 
+1

С моей точки это можно делегировать по шаблону Delegate. –

+0

Можете ли вы подробно рассказать о том, как это сделать? Я попытался, но когда я установил делегат, то есть «слабый var delegate = TaskCancelAble?» Я получаю «делегат члена экземпляра не может быть установлен в типе MySession» – GarySabo

ответ

0

Другой вариант, чтобы получить ссылку на задачу является использование метода - getTasksWithCompletionHandler: из NSURLSession, в котором перечислены все задачи на сессии в сочетании со свойством taskDescription на NSURLSessionTask, чтобы определить задачи

+0

Отличный момент, но мне все еще нужно получить доступ к этому свойству из моего другого класса, где я испытываю трудности – GarySabo

+0

Мой плохой, я думал, что defaulConfiguration имеет такое же поведение, как backgroundConfiguration, где вы можете воссоздать сеанс, пока используете один и тот же идентификатор. – Leonardo

Смежные вопросы