在我的应用程序中,我有一系列后台任务一个接一个地执行(比如任务:A、B 和 C)。这些任务中的每一个都与不同的 Web 服务 (XML) 通信。我正在使用 AFNetworking 库的 AFXMLRequestOperation 向 Web 服务发起请求并在成功块处处理解析逻辑。
每个后续任务都依赖于前一个任务的成功完成。另外,我希望在成功完成之前的几秒钟后调用以下任务。一旦任务 C 成功完成,我就完成了。
所有这一切都发生在后台线程中,因此 UI 线程始终是响应式的(我的 UIActivityIndicator 会为每个任务分别移动)。
这是伪代码片段:
-(void)viewDidLoad
{
_operationQueue = [[NSOperationQueue alloc]init];
[_operationQueue setMaxConcurrentOperationCount:1];
[self taskA];
}
- taskA
{
NSMutableURLRequest *request = urlA;
AFXMLRequestOperation *operationA = [AFXMLRequestOperation XMLParserRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser) {
XMLParser.delegate = someClass;
[XMLParser parse];
// Now since the operation is successful, start task B after a delay of 5 seconds
[self performSelector:@selector(taskB) withObject:nil afterDelay:5];
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, NSXMLParser *XMLParser) {
NSLog(@"NSError: %@",error);
}];
[_operationQueue addOperation: operationA];
}
- taskB
{
NSMutableURLRequest *request = urlB;
AFXMLRequestOperation *operationB = [AFXMLRequestOperation XMLParserRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser) {
XMLParser.delegate = someOtherClass;
[XMLParser parse];
// Now since the operation is successful, start task C after 10 seconds
[self performSelector:@selector(taskC) withObject:nil afterDelay:10];
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, NSXMLParser *XMLParser) {
}];
[_operationQueue addOperation: operationB];
[operationB addDependency:operationA]; // This code seems to produce no result and hence seems redundant
}
- taskC
{
NSMutableURLRequest *request = urlB;
AFXMLRequestOperation *operationC = [AFXMLRequestOperation XMLParserRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser) {
XMLParser.delegate = yetAnotherClass;
[XMLParser parse];
// Now since the operation is successful, mission accomplished!
NSLog(@"Mission accomplished!");
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, NSXMLParser *XMLParser) {
}];
[_operationQueue addOperation: operationB];
[operationC addDependency:operationB]; // This code seems to produce no result and hence seems redundant
}
问题:
通过这个实现,我可以从应用程序中实现我想要的,但我不确定我是否正确使用了 NSOperation 和 NSOperationQueue。在我从 Apple 文档和教程中阅读的内容中,NSOperation 的优势之一是使用它来建立不同操作之间的依赖关系。但是,在我的示例中,如何确保 operationB 仅在任务 A“成功”完成后才执行,从而利用 NSOperation 的“addDependency”功能?
我还想确保仅在成功完成“taskA”等之后的一定延迟后才调用“taskB”。是
[self performSelector:@selector(taskB) withObject:nil afterDelay:5];
唯一的办法吗?还是有其他方法可以使用 NSOperation/NSOperationQueues 的某些元素?或者也许使用类似“dispatch_after”的东西?
总的来说,我怎样才能更好地重新设计代码以使用 NSOperation 完成相同的任务?