这是使用NSOperation(AFXMLRequestOperation)的正确方法吗?

时间:2013-05-03 03:34:33

标签: ios afnetworking nsoperation nsoperationqueue performselector

在我的应用程序中,我有一系列后台执行任务(比如任务: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的一个优势是将它用于不同操作之间的依赖关系建立。但是,在我的示例中,如何确保在任务A“成功”完成后才执行operationB,从而利用NSOperation的“addDependency”功能?

  2. 我还想确保'taskB'仅在某个之后被调用 成功完成'taskA'后延迟等等。是[self performSelector:@selector(taskB) withObject:nil afterDelay:5];

    唯一的方法吗?或者有其他方式,我可以 使用NSOperation / NSOperationQueues的一些元素?或者也许使用 像“dispatch_after”??

  3. 之类的东西

    总的来说,如何更好地重新设计代码以使用NSOperation完成相同的任务?

0 个答案:

没有答案
相关问题