Ios 在操作内部的循环中运行请求操作

Ios 在操作内部的循环中运行请求操作,ios,afnetworking-2,Ios,Afnetworking 2,如何在1个请求的成功块中运行多个请求并等待其完成 [manager GET:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@ Response: \n%@", url, responseObject); resultsArray = [[NSMutableArray alloc] init]; for (NSDictionar

如何在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上

编辑这是我的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;
}

AFNetworking
GET
方法返回一个
athtprequestoperation
(一个
NSOperation
子类)。您可以让
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
更改为(a)捕获
GET
返回的
NSOperation
,然后(b)返回它。

我的getDetails会是什么样子?我是否设置了AFHTTPRequestOperation并以该方法返回它?确定您可以创建自己的
AFHTTPRequestOperation
并将其添加到队列中,或者只执行适当的
GET
请求,为您创建
AFHTTPRequestOperation
,将其添加到管理器队列中并返回给您。(对不起,我假设您已经编写了该方法。)关键是,就像AFNetworking的
GET
方法将
AFHTTPRequestOperation
返回给您的
getDetails
方法一样,您的
getDetails
方法也应该将其返回给上述代码,因此,您可以执行诸如建立依赖项之类的操作。我尝试了此方法,但得到的结果是:操作1成功>完成操作完成>操作2成功。请参阅编辑的问题以了解我的方法getDetails。这可能是因为您只是对操作调用
start
,而不是对操作进行调度
NSOperationQueue
。在处理操作时,您很少应该只调用
start
,而应该将它们添加到
NSOperationQueue
。顺便说一句,您的
AFHTTPRequestOperationManager
有自己的
queue
属性,即它将自己的操作添加到的
NSOperationQueue
。您可以将您的操作添加到该队列中(或者使用
GET
方法,该方法将为您完成此操作)。我已经能够解决此问题,但不知何故,结果的顺序是相反的(但这样就可以了)。只是一个问题,如果向Operation Manager添加队列似乎是一种更好的方法。在执行addoperation WaitUntillFinishe之后,如何手动启动Operation Manager?我不确定这一点,因为我还没有真正连续运行操作。为什么不在其操作队列中使用
AFHTTPRequestOperationManager
和队列操作,为后续操作添加依赖项?这可能会给您串行执行(同样,不确定)。