Ios 连续启动NSURLConnection请求
我在一个包含很少字符串的数组中循环,并为每个字符串向web服务器发出请求 数组中的字符串 我希望在将后续请求发送到服务器之前完全处理每个请求。因为每个请求都会向我发送一个响应,我将在下一个请求中发送该响应,以此类推 我遇到的问题是,我的NSURLConnection是使用标准异步调用建立的。这会导致请求不阻止任何后续请求。但是我需要在第一次完成之前阻止循环中的其他请求 请求URL始终相同,只有JSON数据随循环中的每个请求而变化。 这是我的密码Ios 连续启动NSURLConnection请求,ios,nsurlconnection,Ios,Nsurlconnection,我在一个包含很少字符串的数组中循环,并为每个字符串向web服务器发出请求 数组中的字符串 我希望在将后续请求发送到服务器之前完全处理每个请求。因为每个请求都会向我发送一个响应,我将在下一个请求中发送该响应,以此类推 我遇到的问题是,我的NSURLConnection是使用标准异步调用建立的。这会导致请求不阻止任何后续请求。但是我需要在第一次完成之前阻止循环中的其他请求 请求URL始终相同,只有JSON数据随循环中的每个请求而变化。 这是我的密码 for (int i = 0; i < ar
for (int i = 0; i < array.count; i++)
{
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:finalJSON options:NSJSONWritingPrettyPrinted error:&error];
if (!jsonData) {
NSLog(@"Error creating JSON object: %@", [error localizedDescription]);
}
NSString *url = [NSString stringWithFormat:@“abc.com/folders”];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
[request setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setValue:APIKEY forHTTPHeaderField:@"X_API_KEY"];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:jsonData];
//I am adding all connections to NSDictionary so that later I can process request.
NSURLConnection *connection = [self connectionForRequest:request];
[connection start];
}
for(int i=0;i
我想到了两种解决您问题的方法:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"foo": @"bar"};
[manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { // HERE u can do your second request which uses the first response
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters_new = <USE_YOUR_DATA_FROM_responseObject>;
[manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { // HERE u can do your third request which uses the first and second response
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
AFHTTPRequestOperationManager*manager=[AFHTTPRequestOperationManager];
NSDictionary*参数=@{@“foo”:@“bar”};
[经理职务:@”http://example.com/resources.json参数:参数成功:^(AFHTTPRequestOperation*operation,id responseObject){//这里您可以执行使用第一个响应的第二个请求
AFHTTPRequestOperationManager*manager=[AFHTTPRequestOperationManager];
NSDictionary*参数_new=;
[经理职务:@”http://example.com/resources.json参数:参数成功:^(AFHTTPRequestOperation*operation,id responseObject){//这里您可以执行使用第一个和第二个响应的第三个请求
}失败:^(AFHTTPRequestOperation*操作,NSError*错误){
NSLog(@“错误:%@”,错误);
}];
}失败:^(AFHTTPRequestOperation*操作,NSError*错误){
NSLog(@“错误:%@”,错误);
}];
实现这一点的简单方法是使用递归。创建一个发送url连接的方法,一旦连接完成,调用自身再次发送
解决方案的关键在于:创建一个可以递归调用的方法,该方法发送请求并收集结果。通过在完成块中递归调用自身,此方法确保每个请求在前一个请求完成后启动
// note - edited per the comments to get a new NSURLRequest each time
- (void)makeRequests:(NSInteger)count
results:(NSMutableArray *)results
completion:(void (^)(NSError *))completion {
// complete recursion
if (count == 0) return completion(nil);
NSURLRequest *request = [self nextRequest];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
if (!error) {
[results addObject:data];
[self makeRequests:count-1 results:results completion:completion];
} else {
completion(error);
}
}];
}
要调用它,请分配一个将携带结果的数组
- (void)makeManyRequests {
NSMutableArray *resultsArray = [NSMutableArray array];
[self makeRequests:10 results:resultsArray completion:^(NSError *error) {
NSLog(@"done. results are %@", resultsArray);
}];
}
编辑-OP中不清楚此请求每次是如何变化的,但听起来您已经知道了。这只是您最初在自己的方法中发布的代码。考虑到这一点是个好主意,这样您的代码就可以清楚地了解每次如何形成不同的JSON负载
- (NSURLRequest *)nextRequest {
id finalJSON = // your app supplies...
// somehow, this changes each time nextRequest is called
NSString *APIKEY = // your app supplies
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:finalJSON options:NSJSONWritingPrettyPrinted error:&error];
if (!jsonData) {
NSLog(@"Error creating JSON object: %@", [error localizedDescription]);
}
// your request creation code, copied from the OP
NSString *url = [NSString stringWithFormat:@"abc.com/folders"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
[request setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setValue:APIKEY forHTTPHeaderField:@"X_API_KEY"];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:jsonData];
return request;
}
有什么问题吗???“我遇到的问题是,我的NSURLConnection是使用标准异步调用设置的。这导致请求不会阻止任何后续请求。”???嘿@gran33,我只想在收到第一个响应时启动第二个连接。但这里发生的是,请求是并行的,这是一种类型的错误……只需看看我更新的Eddok,看看我的下一个答案……RANJIT——考虑一个递归解决方案。您好@ GRAN33谢谢,我不想在完成所有请求之后做一些任务,例如,假设我的数组计数是4,那么当我在循环中运行时,它会发出4个请求,所以在这里面,我只想阻止其他3个请求,直到第一个请求完成响应,等等。请告诉我你理解了什么,还有什么不理解。这样我可以更好地解释你。m8=mate;)我不明白这一点:“所以在这里面,我只想阻止其他3个请求,直到第一个请求完成响应,等等”好吧,让我解释一下,我有一个数组,它包含很少的字符串,每个字符串都必须通过单独的请求传递。所以我运行循环,发出4个请求,并以JSON格式传递字符串。所以当我用第一个请求发送第一个字符串时,它将返回一个响应,所以对于第二个请求,我应该从第一个响应发送一些值,依此类推。。。但目前的情况是,调用会一个接一个地立即启动,而不必等待前一个请求的响应?我还没有使用过网络,所以我需要先学习它。如果我删除for循环,我怎么知道要发出多少请求呢?Hello@danh谢谢你的回答,正如你所说,我的代码做同样的事情,但我使用循环,因为每次我发送新的json。JSON数据会随着每次更新而变化