在我的应用程序中,我有一系列后台执行任务(比如任务: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的一个优势是将它用于不同操作之间的依赖关系建立。但是,在我的示例中,如何确保在任务A“成功”完成后才执行operationB,从而利用NSOperation的“addDependency”功能?
我还想确保'taskB'仅在某个之后被调用
成功完成'taskA'后延迟等等。是[self performSelector:@selector(taskB) withObject:nil afterDelay:5];
唯一的方法吗?或者有其他方式,我可以 使用NSOperation / NSOperationQueues的一些元素?或者也许使用 像“dispatch_after”??
总的来说,如何更好地重新设计代码以使用NSOperation完成相同的任务?