gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:37:07 24 4
gpt4 key购买 nike

我有一个方法,可以调用它来使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com