У меня есть класс 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
}
С моей точки это можно делегировать по шаблону Delegate. –
Можете ли вы подробно рассказать о том, как это сделать? Я попытался, но когда я установил делегат, то есть «слабый var delegate = TaskCancelAble?» Я получаю «делегат члена экземпляра не может быть установлен в типе MySession» – GarySabo