sendSynchronousRequest / connectionDidFinishLoading

时间:2014-06-29 21:48:34

标签: ios objective-c nsurlconnection synchronous

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

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

这是我的循环代码:

-(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时,我只是将代码用于操作connectionDidFinishLoading中的数据,它运行正常。但是使用sendSynchronousRequest,即使NSLog显示循环代码正在循环,connectionDidFinishLoading中的代码也永远不会运行。

我该如何解决这个问题?

(或者我完全采取了错误的做法?)

2 个答案:

答案 0 :(得分:0)

当您发送异步请求时,

connectionDidFinishLoadingNSURLConnection委托方法。通常,您实施此方法以获取已加载的数据,但您不需要这样做,因为它会同步返回并分配给您的data变量。

但是我会注意到,你肯定会采取一种糟糕的方法。

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

但问题是你的代码实际发生了什么。

我们创建一个URL,发送同步请求,当它完成时,将返回值分配给data

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

答案 1 :(得分:0)

以下是如何利用@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();
    }
}

这将运行100个索引为0..99的请求,将结果放在一个可变数组中。这样称呼:

NSMutableArray *results = [NSMutableArray array];
[self doRequest:0 gatheringResultsIn:results completion:^{
    NSLog(@"100 NSData objects should be here: %@", results);
}];