0

在我的应用程序中,我有一系列后台任务一个接一个地执行(比如任务:A、B 和 C)。这些任务中的每一个都与不同的 Web 服务 (XML) 通信。我正在使用 AFNetworking 库的 AFXMLRequestOperation 向 Web 服务发起请求并在成功块处处理解析逻辑。

每个后续任务都依赖于前一个任务的成功完成。另外,我希望在成功完成之前的几秒钟后调用以下任务。一旦任务 C 成功完成,我就完成了。

所有这一切都发生在后台线程中,因此 UI 线程始终是响应式的(我的 UIActivityIndi​​cator 会为每个任务分别移动)。

这是伪代码片段:

-(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
}

问题:

  1. 通过这个实现,我可以从应用程序中实现我想要的,但我不确定我是否正确使用了 NSOperation 和 NSOperationQueue。在我从 Apple 文档和教程中阅读的内容中,NSOperation 的优势之一是使用它来建立不同操作之间的依赖关系。但是,在我的示例中,如何确保 operationB 仅在任务 A“成功”完成后才执行,从而利用 NSOperation 的“addDependency”功能?

  2. 我还想确保仅在成功完成“taskA”等之后的一定延迟后才调用“taskB”。是[self performSelector:@selector(taskB) withObject:nil afterDelay:5];

    唯一的办法吗?还是有其他方法可以使用 NSOperation/NSOperationQueues 的某些元素?或者也许使用类似“dispatch_after”的东西?

总的来说,我怎样才能更好地重新设计代码以使用 NSOperation 完成相同的任务?

4

0 回答 0