取消所有操作 + AFNetworking 3.0

7

我创建了一个名为HTTPServiceProvider的类,它继承自AFURLSessionManager。我添加了以下代码以获取数据。

let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
let manager = AFURLSessionManager(sessionConfiguration: configuration)
let dataTask = manager.dataTaskWithRequest(request) { (response, responseObject, error) in
         //Perform some task
}
dataTask.resume()

我希望将dataTask添加到AFURLSesstionManger提供的operationQueue中,并在调用相同请求之前在其他类(BaseController.swift)中取消所有操作。 尝试了以下代码但无效: -
self.operationQueue.addOperationWithBlock{
     //Added above code
}

在BaseController.swift文件中,调用 -

HTTPServiceProvide.sharedInstance.operationQueue.cancelAllOperations

但它没有起作用 :(

谢谢。


在每次调用 manager.operationQueue.cancelAllOperations() 之前尝试执行此操作。 - Anbu.Karthik
1
它不起作用是因为在将任何操作添加到队列之前,你怎么能取消该操作。 - ranjit.x.singh
在这个项目中可能不太可能,但建议在使用Swift时使用Alamofire而不是AFNetworking。 - Fogmeister
4个回答

6

对我而言,取消所有请求的最佳方式是:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //manager should be instance which you are using across application
[manager.session invalidateAndCancel];

这种方法有一个很大的优势:所有执行的请求都会调用失败块。我的意思是,例如这个:
        [manager GET:url
        parameters:nil
          progress:^(NSProgress * _Nonnull downloadProgress) {
              code
          } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
              code
          } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
              //this section will be executed
          }];

需要注意的两件事:

  • 使用 invalidateAndCancel 方法取消请求时,只能取消由此特定的 AFHTTPSessionManager 实例执行的请求。
  • 在取消所有请求后,您需要初始化新的 AFHTTPSessionManager 实例。如果您尝试使用旧实例进行请求,则会发生异常。

1
我想在operationQueue中添加dataTask,然后取消operationQueue中的所有操作。 - ranjit.x.singh

3

使用 NSURLSession 取消所有数据任务:

manager.session.getTasksWithCompletionHandler { (dataTasks, uploadTasks, downloadTasks) in
    dataTasks.forEach { $0.cancel() }
}

我想在operationQueue中添加dataTask,然后取消operationQueue中的所有操作。 - ranjit.x.singh

1

也许可以使用AFURLSessionManager

// 使管理的会话失效,可选择取消待处理任务。 - (void)invalidateSessionCancelingTasks:(BOOL)cancelPendingTasks

这不是你想要的吗?


1
我创建了一个任务数组:

var tasks = [URLSessionDataTask]()

然后添加了dataTask,在进行新的http请求之前我想要取消它。

tasks.append(dataTask)

而要取消所有操作,我使用了:

func cancelPreviousRequest() {
    for task in tasks
       (task as URLSessionTask).cancel()
    }
    tasks.removeAll()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接