Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 连续启动NSURLConnection请求_Ios_Nsurlconnection - Fatal编程技术网

Ios 连续启动NSURLConnection请求

Ios 连续启动NSURLConnection请求,ios,nsurlconnection,Ios,Nsurlconnection,我在一个包含很少字符串的数组中循环,并为每个字符串向web服务器发出请求 数组中的字符串 我希望在将后续请求发送到服务器之前完全处理每个请求。因为每个请求都会向我发送一个响应,我将在下一个请求中发送该响应,以此类推 我遇到的问题是,我的NSURLConnection是使用标准异步调用建立的。这会导致请求不阻止任何后续请求。但是我需要在第一次完成之前阻止循环中的其他请求 请求URL始终相同,只有JSON数据随循环中的每个请求而变化。 这是我的密码 for (int i = 0; i < ar

我在一个包含很少字符串的数组中循环,并为每个字符串向web服务器发出请求 数组中的字符串

我希望在将后续请求发送到服务器之前完全处理每个请求。因为每个请求都会向我发送一个响应,我将在下一个请求中发送该响应,以此类推

我遇到的问题是,我的NSURLConnection是使用标准异步调用建立的。这会导致请求不阻止任何后续请求。但是我需要在第一次完成之前阻止循环中的其他请求

请求URL始终相同,只有JSON数据随循环中的每个请求而变化。 这是我的密码

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
我想到了两种解决您问题的方法:

  • -U可以使用AFNetworking并在success块中维护计数器。计数器将计算请求数,当所有请求完成时,将执行您的下一个任务

  • GCD——大中央调度为您提供了一个选项,可以在最后(当所有请求完成时)进行分组或请求并执行某些操作。为此,你需要阅读nice教程(Ray Wenderlich的第二部分)。如果你不熟悉GCD,请跳到教程的第一部分

  • 无论如何,用上面的代码,你无法完成你的任务。您没有在请求结束时运行的任何异步块

    编辑:

    使用网络:

    您必须先删除for循环,然后执行以下操作:

    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数据会随着每次更新而变化