iphone - 如何使用 ASIHTTP 保持连接处于事件状态?我需要发出多个请求,但无法打开然后关闭请求连接

标签 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;
 }

这种方法效果不错,但速度真的很慢。另一方面,我正在迭代 for 循环,因此如果我需要收集的图片数组有 20 个图像,则此方法会被调用 20 次。我希望提高此过程的效率,并且我认为我应该能够在此方法中迭代我需要收集的所有图像 ID。

在我看来,进展如此缓慢的原因是我们不断打开和关闭多个请求。我拉入的图像平均约为 15kb。

我的问题:我可以做些什么来更改此方法,以便提高效率并利用 HTTP keep-alive 功能?我想,我可以不传递图像 ID,而只传递需要创建的数组的计数,然后在请求方法中设置某种 for 循环,然后允许我传回图像数组...

这是要走的路吗?我有什么遗漏的吗?感谢您的帮助和意见!!

最佳答案

之所以慢得要命,是因为您正在逐一同步执行请求(无论如何这始终是禁忌)。您需要重构您的下载方法,以异步和并发方式工作。

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

  • 创建一个全局网络连接“ Controller ”(可从您的应用程序委托(delegate)访问),它可以在需要时动态创建 ASINetworkQueue,并在没有请求时释放它
  • 将您的请求包装到 ASIHTTPRequest 的子类中,并重写这些子类中的完成/失败方法(如果您愿意,可以让它们使用返回的数据触发通知;或者写入磁盘并使用它们的引用更新数据库)。<
  • 对于每个请求,获取队列引用,并将您的请求添加到队列中。
  • 队列将根据需要增长和缩小

如果我在我的电脑前,我会在 github 上查看一个这样的例子,但实际上唯一困难的部分是全局连接管理器,ASI* 的人写了一个很好的例子 here在 gist.github 上。另外,对上述内容的更好解释(我从中学到的)是 here .

关于iphone - 如何使用 ASIHTTP 保持连接处于事件状态?我需要发出多个请求,但无法打开然后关闭请求连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5427915/

相关文章:

php - 保留 .htaccess 中的 & 符号登录 URL

elasticsearch - Elasticsearch 中默认值有什么用

iphone - objc_msg发送崩溃:如何找到位置?

iphone - 基于#if评估的iOS接口(interface)声明

c++ - 有没有一种方法可以更有效地将二进制 double 从文件读取到 float 数组中?

apache - 关于丢失 HTTP 请求

iphone - 如何获取插入我当前 View 的上一个 View Controller

iphone - 清晰的上下文图形

sql - 查询执行计划: missing index

php - PHP 中什么更快,单引号还是双引号?