如何使用ASIHTTP保持连接活动?我需要发出多个请求,但无法打开,然后关闭请求连接

Ste*_* J. 3 iphone performance get uiimage asihttprequest

我有一个方法,我打电话来使用GET发出Web服务请求.它看起来像这样:

- (UIImage*)getImageWithSeriesGUID:(NSString*)seriesGUID ImageID:(int)imageID {

NSString * unescapedString = RIVERWOODS_GET_IMAGE(seriesGUID, imageID);

NSURL *url = [[NSURL alloc] initWithString:[unescapedString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];


ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

[request setRequestMethod:@"GET"];
[request addRequestHeader:@"Connection" value:@"Keep-Alive"];

[request startSynchronous];
NSError *error = [request error];
if (!error) {
    NSData *response = [request responseData];
    //NSLog(@"Size: %@",[response length]);
    NSString *content = [[[NSString alloc] initWithData:response
                                               encoding:NSUTF8StringEncoding] autorelease];
    NSLog(@"Data: %@", content);
    UIImage *image = [UIImage imageWithData:response];
    return image;
}

return nil;
 }
Run Code Online (Sandbox Code Playgroud)

这种方法可行,但它真的很慢.另一方面,我正在迭代for循环,所以如果我需要收集的图片数组有20个图像,这个方法会被调用20次.我希望提高这个过程的效率,我想我应该能够在这个方法中迭代我需要收集的所有图像ID.

在我看来,这种情况变得如此缓慢的原因是因为我们不断打开和关闭的多个请求.我提到的图像平均约为15kb.

我的问题:我可以做些什么来改变这种方法,以便我可以提高效率并利用HTTP保持活动功能?我在想,不是传入图像ID,而是传递我需要制作的数组的计数,然后在请求方法中设置一些类型的for循环,然后允许我传回来一系列图像......

这是要走的路吗?有什么我想念的吗?感谢您的帮助和投入!

Ala*_*ino 6

之所以这么慢,是因为你正在同步地执行请求(无论如何都是一无所有),一个接一个.您需要重构下载方法以异步和并发工作.

我以这种方式在线上请求数据的方法如下:

  • 创建一个全局网络连接"控制器"(可从您的App Delegate访问),可以在需要时动态创建ASINetworkQueue,并在没有请求时保留它
  • 将您的请求包装到ASIHTTPRequest的子类中,并覆盖这些子类中的done/fail方法(如果您愿意,可以使用返回的数据触发通知;或者写入磁盘并使用其引用更新数据库).
  • 对于每个请求,请获取队列引用,并将您的请求添加到队列中.
  • 队列将根据需要增长和缩小

如果我是在我的电脑上我检查到github上这样的例子,但真的是唯一困难的部分是全球连接管理器,以及ASI*家伙写了一个很好的例子,在这里上gist.github.此外,上面(我从中学到的)的更好解释在这里.

  • 当然可以 - 使用同步请求可以防止并行(并发)发出20个请求,并且还会导致一个请求结束和下一个请求完成之间的[小]延迟.如果发出异步请求,它们可以并行发出,并且ASIHTTPRequest线程将在前一个请求完成时自动启动下一个排队请求. (2认同)