使用AFHTTPRequestOperation时在操作之间创建依赖关系

时间:2014-09-10 07:36:18

标签: objective-c macos afnetworking objective-c-blocks

我在mac应用程序中使用AFNetworking(2.4.1)。我希望在完成所有其他操作(AFHTTPRequestOperation)之后添加我自己的块操作。我已经尝试在completionOperation和其他之间添加依赖项,但completionOperation块仍然在其他成功完成或失败之前执行。

下面是用于说明基础知识的代码的缩减版本。有人能够建议如何使这项工作?感谢。

AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] init];

    NSBlockOperation *completionOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"All operations complete");
        }];


    NSMutableURLRequest *request1 = [[AFHTTPRequestSerializer serializer] requestWithMethod:@"GET" URLString:[[NSURL URLWithString:@"https://api.parse.com/1/classes/SomeClass"] absoluteString] parameters:nil error:nil];
    AFHTTPRequestOperation *operation1 = [manager HTTPRequestOperationWithRequest:request1 success:
    ^(AFHTTPRequestOperation *operation, id responseObject)
    {
            NSLog(@"operation 1 success");
    }
    failure:^(AFHTTPRequestOperation *operation, NSError *error)
    {
            NSLog(@"operation 1 failure");
    }];

    NSMutableURLRequest *request2 = [[AFHTTPRequestSerializer serializer] requestWithMethod:@"GET" URLString:[[NSURL URLWithString:@"https://api.parse.com/1/classes/OtherClass"] absoluteString] parameters:nil error:nil];
    AFHTTPRequestOperation *operation2 = [manager HTTPRequestOperationWithRequest:request2 success:
    ^(AFHTTPRequestOperation *operation, id responseObject)
    {
            NSLog(@"operation 2 success");
    }
    failure:^(AFHTTPRequestOperation *operation, NSError *error)
    {
            NSLog(@"operation 2 failure");
    }];

    [completionOperation addDependency:operation1];
    [completionOperation addDependency:operation2];

    [manager.operationQueue addOperation:operation1];
    [manager.operationQueue addOperation:operation2];
    [manager.operationQueue addOperation:completionOperation];

1 个答案:

答案 0 :(得分:1)

    - (void) test3:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
                     failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure

{

  // block 1
    NSString *string = [NSString stringWithFormat:@"%@weather.php?format=json", BaseURLString];
    NSURL *urll = [NSURL URLWithString:string];
    NSURLRequest *request = [NSURLRequest requestWithURL:urll];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    operation.responseSerializer = [AFJSONResponseSerializer serializer];

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"OPERATION 1  %@",responseObject );
        test_Sync = @"done";
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        test_Sync = @"faile"; }];

    //block 2
    NSString *string2 = [NSString stringWithFormat:@"%@weather.php?format=json", BaseURLString];
    NSURL *urll2 = [NSURL URLWithString:string2];
    NSURLRequest *request2 = [NSURLRequest requestWithURL:urll2];

    AFHTTPRequestOperation *operation2 = [[AFHTTPRequestOperation alloc] initWithRequest:request2];

    [operation2 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation2, id responseObject) {
        // Print the response body in text
        NSLog(@"Response: OPERATION 2 %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);
    } failure:^(AFHTTPRequestOperation *operation2, NSError *error) {
        NSLog(@"Error: %@", error);
    }];

    // Add the operation to a queue
    // It will start once added
    NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
    // Make operation2 depend on operation1
    [operation addDependency:operation2];
    [operationQueue addOperations:@[operation, operation2] waitUntilFinished:YES];

}