2014-08-28 4 views
0

Как я могу запустить несколько запросов в блоке успеха из 1 запроса и дождаться завершения?Операции запроса на выполнение в цикле внутри операции

[manager GET:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"%@ Response: \n%@", url, responseObject); 
    resultsArray = [[NSMutableArray alloc] init]; 
    for (NSDictionary *json in [responseObject objectForKey:@"items"]) { 
     [self getDetails:json]; 
    } 

} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    [SVProgressHUD dismiss]; 
}]; 

Где в getDetails: (ID) JSON является метод, чтобы загрузить группу запросов, параметры которых на основании результата основного запроса.

Например: Я хотел бы запросить у API список студентов, а затем блок успеха. Для каждого ученика я хотел бы получить связанные данные из другой таблицы (другой запрос) и поместить их в свой NSObject.

EDIT Вот мой метод getDetails

- (AFHTTPRequestOperation *)getDetails:(NSDictionary *)json 
{ 
    NSLog(@"Start Op %@",[json objectForKey:@"related_salon"]); 
    NSString *url = [NSString stringWithFormat:@"%@read/salons/%@",SERVER_API_URL,[json objectForKey:@"related_salon"]]; 
    NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; 
    AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:req]; 
    //op.responseSerializer = [AFJSONResponseSerializer serializer]; 
    [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"Success %@",[json objectForKey:@"name"]); 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Failed Op %@",error.localizedDescription); 
    }]; 
    //AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:req]; 
    //op.responseSerializer = [AFJSONResponseSerializer serializer]; 
    [op start]; 
    return op; 
} 
+0

Я не уверен в этом, так как я еще не запускал операции серийно. Почему бы не использовать 'AFHTTPRequestOperationManager' и операции очереди в своей очереди операций, добавляя зависимости для последующих операций? Это ** может ** дать вам серийное исполнение (опять же, не уверен). – n00bProgrammer

ответ

0

GET метод AFNetworking возвращает ATHTTPRequestOperationNSOperation подклассе). Возможно, ваш метод getDetails вернет этот объект. Затем вы можете создать новую операцию в зависимости от тех операций, которые вы бы запустить в конце:

NSOperation *completionOperation = [NSBlockOperation blockOperationWithBlock:^{ 
    // add here whatever you want to perform when all the getDetails calls are done, 
    // e.g. maybe you want to dismiss your HUD when all the requests are done. 
    [SVProgressHUD dismiss]; 
}]; 

[manager GET:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"%@ Response: \n%@", url, responseObject); 
    resultsArray = [[NSMutableArray alloc] init]; 
    for (NSDictionary *json in [responseObject objectForKey:@"items"]) { 
     NSOperation *operation = [self getDetails:json]; 
     [completionOperation addDependency:operation]; 
    } 

    [[NSOperationQueue mainQueue] addOperation:completionOperation]; 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    [SVProgressHUD dismiss]; 
}]; 

Опять же, это предполагая, что getDetails делает свой GET вызов, и вы измените getDetails (а) захватить NSOperation, возвращенный GET и (b) вернуть его.

+0

Как будут выглядеть мои getDetails? Я устанавливаю AFHTTPRequestOperation и возвращаю его в этом методе? –

+0

Уверен, что вы можете создать собственное 'AFHTTPRequestOperation' и добавить его в очередь или просто выполнить соответствующий запрос' GET', который создает для вас 'AFHTTPRequestOperation', добавляет его в очередь менеджера и возвращает его вам. (Извините, я предположил, что вы уже написали этот метод.) Ключ в том, что так же, как метод GET' AFNetworking возвращает 'AFHTTPRequestOperation' вашему методу' getDetails', ваш метод getDetails должен также вернуть его обратно к вышеуказанному коду, поэтому вы можете делать такие вещи, как устанавливать зависимости. – Rob

+0

Я попробовал этот метод, но я получаю результат: операций 1 Успех> CompletionOperation Готово> операции 2 Успеха Пожалуйста, смотрите отредактированный вопрос для моего метода getDetails. –

Смежные вопросы