我想按顺序执行一系列AFJSONRequestOperation,并且能够在一个失败时中断队列。
目前,我这样做的方式并不可靠,因为有时下一次操作将有机会开始。
我有一个单身人士来调用我的api端点
AFJSONRequestOperation *lastOperation; // Used to add dependency
NSMutableArray *operations = [NSMutableArray array]; // Operations stack
AFAPIClient *httpClient = [AFAPIClient sharedClient];
[[httpClient operationQueue] setMaxConcurrentOperationCount:1]; // One by one
然后我以这种方式添加操作
NSMutableURLRequest *request = ...; // define request
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
// Takes care of success
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
[[httpClient operationQueue] setSuspended:YES];
[[httpClient operationQueue] cancelAllOperations];
}];
[push:operation addDependency:lastOperation];
[operations $push:operation]; // This is using ConciseKit
lastOperation = operation;
// Repeat with other operations
// Enqueue a batch of operations
[httpClient enqueueBatchOfHTTPRequestOperations:operations ...
麻烦的是,有时失败者之后的操作仍然有机会开始。
所以似乎有1个并发操作max和一个依赖链不足以告诉队列等到完全执行失败回调之后。
这样做的正确方法是什么?
由于
答案 0 :(得分:1)
在主线程上执行失败回调,并且操作(在后台线程上运行)不等待它。因此,您需要进行一些编辑,以防止在操作及其完成块完成之前启动下一个操作。
或者,不是在开始时将所有操作放入队列,而是在数组中保存操作列表,并在每次成功后添加下一个操作。