首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >sendSynchronousRequest/connectionDidFinishLoading

sendSynchronousRequest/connectionDidFinishLoading
EN

Stack Overflow用户
提问于 2014-06-29 21:48:34
回答 2查看 183关注 0票数 1

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

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

这是我的循环代码:

代码语言:javascript
运行
复制
-(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中的代码也不会运行。

我怎么才能解决这个问题?

(还是我完全走错了路?)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-29 22:18:41

下面是如何采纳@nhgrif的好建议来执行异步并保存所有结果。

代码语言:javascript
运行
复制
- (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的请求,将结果放在一个可变数组中。就这样说吧:

代码语言:javascript
运行
复制
NSMutableArray *results = [NSMutableArray array];
[self doRequest:0 gatheringResultsIn:results completion:^{
    NSLog(@"100 NSData objects should be here: %@", results);
}];
票数 0
EN

Stack Overflow用户

发布于 2014-06-29 21:54:57

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

不过,我要指出的是,你在这方面的做法肯定很差。

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

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24480585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档