Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.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/5/objective-c/23.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 sendSynchronousRequest/ConnectiondFinishLoading_Ios_Objective C_Nsurlconnection_Synchronous - Fatal编程技术网

Ios sendSynchronousRequest/ConnectiondFinishLoading

Ios sendSynchronousRequest/ConnectiondFinishLoading,ios,objective-c,nsurlconnection,synchronous,Ios,Objective C,Nsurlconnection,Synchronous,我第一次使用同步请求,希望得到一些帮助。我正在编写的代码仅用于我自己的用途,鉴于其目的,同步请求不是问题 代码从系列中的网页获取数据,处理数据,移动到系列中的下一页,处理该数据,等等。我使用同步请求是因为我需要连接来完成加载,并且在函数循环到下一页之前需要处理数据 这是我的循环代码: -(NSData *)myMethod { NSString *string; NSData *data; for (int x = 1; x<100; x++) {

我第一次使用同步请求,希望得到一些帮助。我正在编写的代码仅用于我自己的用途,鉴于其目的,同步请求不是问题

代码从系列中的网页获取数据,处理数据,移动到系列中的下一页,处理该数据,等等。我使用同步请求是因为我需要连接来完成加载,并且在函数循环到下一页之前需要处理数据

这是我的循环代码:

-(NSData *)myMethod {
    NSString *string;
    NSData *data;
    for (int x = 1; x<100; x++) {
        string = [NSString stringWithFormat:@"http://www.blahblah.com/%d",(x)];
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:string]];
        NSURLResponse *response = nil;
        NSError *error = nil;
        data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    }
    return data;
}
当我使用connectionWithRequest时,我只是将代码放在ConnectionIDFinishLoading中操作数据,效果很好。但对于sendSynchronousRequest,即使NSLog显示循环代码正在循环,ConnectiondFinishLoading中的代码也不会运行

我怎样才能解决这个问题

还是我采取了完全错误的方法?

ConnectionDiFinishLoading是一种NSURLConnection委托方法,用于发送异步请求时。通常,您可以实现此方法来获取加载的数据,但不需要这样做,因为它是同步返回并分配给数据变量的

不过,我会注意到,你在这里采取的方法肯定很糟糕

首先,如果您在这里使用异步请求,您可以基本上同时查询所有100个URL,并让它们在自己的时间内返回

但更大的问题是代码实际发生了什么

我们创建一个URL,发送同步请求,完成后,将返回分配给数据


。。。然后我们循环。这样做99次。我们每次向不同的URL发出99次同步请求,并覆盖前一个请求加载的数据。在第100次之后,我们退出循环并返回我们在最终请求中下载的数据。

下面是如何接受@nhgrif的建议来执行异步并保留所有结果

- (void)doRequest:(NSInteger)requestIndex gatheringResultsIn:(NSMutableArray *)array completion:(void (^)(void))completion {

    if (requestIndex < 100) {
        NSString *string = [NSString stringWithFormat:@"http://www.blahblah.com/%d",(requestIndex)];
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:string]];
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
            if (data) [array addObject:data];
            [self doRequest:requestIndex+1 gatheringResultsIn:array completion: completion];
        }];
    } else {
        completion();
    }
}

非常感谢。虽然下一个答案似乎有一些建议,但我还不明白如何异步执行,但去掉覆盖使它变得更好。谢谢你的帮助,非常感谢!我在路上吃晚饭,等不及要回去的时候试试看!乔尔德夫纳-当然。请注意,我做了一个小编辑,用requestIndex替换了“x”循环变量。是的,我找到了答案,它完全有效!我的意思是,有些事情还不起作用,特别是因为我仍然不理解块和补全,但很明显,这里讨论的问题很好。
NSMutableArray *results = [NSMutableArray array];
[self doRequest:0 gatheringResultsIn:results completion:^{
    NSLog(@"100 NSData objects should be here: %@", results);
}];