【问题标题】:Taking time to load the image from URL to UIImageview花时间将图像从 URL 加载到 UIImageview
【发布时间】:2013-09-01 15:20:02
【问题描述】:

我正在使用此代码将图像从 URL 显示到 UIImageview

UIImageView *myview=[[UIImageView alloc]init];

myview.frame = CGRectMake(50, 50, 320, 480);

NSURL *imgURL=[[NSURL alloc]initWithString:@"http://soccerlens.com/files/2011/03/chelsea-1112-home.png"];

NSData *imgdata=[[NSData alloc]initWithContentsOfURL:imgURL];

UIImage *image=[[UIImage alloc]initWithData:imgdata];

myview.image=image;

[self.view addSubview:myview];

但问题是在 imageview 中显示图像需要很长时间。

请帮帮我...

有什么方法可以加快进程...

【问题讨论】:

  • 当这完全取决于所用网络的强度时,您如何期望代码能够更快地下载数据。
  • 您可以按照其他答案的建议使用 GCD,但这同样慢,只是不会冻结应用程序。
  • 我花了大约 3 秒来加载图像。您是一次单独加载此图像还是并行运行更多下载?您可以使用一些更快的图像下载服务吗?是否可以选择加载较小的图像文件(以像素为单位的较小尺寸)?您可以切换到高度压缩的 JPEG 吗?您可以使用启用某些缓存的框架(我认为 NSData 不会这样做)。这是一个选择吗?含义:您是否一次又一次地加载相同的图像?
  • @HermannKlecker 我们正在为应用程序使用不同的图像...
  • @HermannKlecker 关于在使用移动设备时下载某个资源需要多长时间的陈述总是毫无意义。建立连接可能需要长达 15 秒的时间。正确的方法是为用户提供更好的体验,无论需要多长时间。

标签: iphone ios objective-c path uiimageview


【解决方案1】:

使用SDWebImage 代替dispatch_async 来缓存图像。

这是我见过的最好的......

dispatch_async 的问题是,如果您从图像中失去焦点,它将再次加载。但是 SDWebImage 会缓存图像,并且不会再次重新加载。

【讨论】:

【解决方案2】:

在我自己的问题 Understanding the behaviour of [NSData dataWithContentsOfURL:URL] inside the GCD block 上给我的答案确实是有道理的。所以请确保如果您在 GCD 中使用 [NSData dataWithContentsOfURL:URL](就像现在许多开发人员所做的那样)不是下载文件/图像的好主意。所以我倾向于下面的方法(你可以使用NSOperationQueue)。

使用[NSURLConnection sendAsynchronousRequest:queue:completionHandler: 加载您的图像,然后使用 NSCache 防止一次又一次地下载相同的图像。

正如许多开发人员所建议的那样,请选择 SDWebimage,它确实包含上述​​下载图像文件的策略。您可以加载任意数量的图像,并且不会下载相同的 URL代码作者多次引用

编辑

[NSURLConnection sendAsynchronousRequest:queue:completionHandler: 上的示例

NSURL *url = [NSURL URLWithString:@"your_URL"];
NSURLRequest *myUrlRequest = [NSURLRequest requestWithURL:url];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:myUrlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{

    if ([data length] > 0 && error == nil)
        //doSomething With The data

    else if (error != nil && error.code == ERROR_CODE_TIMEOUT)
        //time out error

    else if (error != nil)
        //download error
}];

【讨论】:

    【解决方案3】:
    Use Dispatch queue to load image from URL.
    
    
    dispatch_async(dispatch_get_main_queue(), ^{
    
      });
    
    Or add a placeholder image till your image gets load from URL.
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多