Ios 在操作内部的循环中运行请求操作
如何在1个请求的成功块中运行多个请求并等待其完成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
[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
和队列操作,为后续操作添加依赖项?这可能会给您串行执行(同样,不确定)。