从Web加载UIImage的最常用方法

时间:2013-04-07 17:59:54

标签: iphone ios objective-c xcode cocoa

亲爱的stackoverflowers,

我误入歧途。

在我的应用中,我从网上加载了2张图片,如下所示:

-(void)loadImages
{
  ...

  image1 = [UIImage imageWithData:[NSData dataWithContentsOfURL:imgUrl1]];
  image2 = [UIImage imageWithData:[NSData dataWithContentsOfURL:imgUrl2]];
}

为了不阻止主线程,我使用 GCD

dispatch_async( dispatch_get_global_queue(0,0), ^{
            [self loadImages];

之后,我在UITableView

中使用这些图片
if (indexPath.row == 0)
    {
        cell.imageView.image = image1;
    }
    else
    {
        cell.imageView.image = image2;
    }

然后我决定添加UIActivityIndicator,但遇到了一些问题。我明白我的代码不正确。我看到有人使用NSURLRequestNSURLConnection加载图片并添加UIActivityIndicator

请你告诉我,加载这样的图像最直接的方法是什么?我该怎么改写?

3 个答案:

答案 0 :(得分:3)

我建议你使用AsyncImageView,这是iCarousel的Nicklockwood -father的一个很好的实现。

https://github.com/nicklockwood/AsyncImageView

使用起来非常简单。

    #import "AsyncImageView.h"

并在所有imageViews中执行此操作。

    [imageView setImage:@"default.png"];
    [imageView setImageURL:@"whateverurl/whateverimage.png"];

在你的情况下,它将是:       [cell.imageView setImageURL:@“yourURL”];

它就像一个魅力,我的代码正在生产中。但是,如果您仍希望代码能够正常运行,请尝试以下方法:

 UIActivityIndicator *activity =[[UIActivityIndicator alloc] initWithStyle:UIActivityIndicatorWhite];
 [activity setFrame:CGRectMake(100,100,30,30)];
 [self.view addSubview:activity];

 dispatch_queue_t dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
 dispatch_async(dispatchQueue, ^(void)
 { 
  [activity startAnimating];
 [self loadImages];
 dispatch_sync(dispatch_get_main_queue(), ^{ 
 [yourTableView reloadData];
 [activity stopAnimating];
 [activty setHidden:YES];
 });
 }); 

答案 1 :(得分:2)

如果我想使用自己的自定义代码,我可以告诉你我通常会做什么

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    NSData * imageData = [NSData dataWithContentsOfURL:_pictureURL];
    dispatch_async(dispatch_get_main_queue(), ^{
        imageView.image = [UIImage imageWithData:imageData];
    });
});

否则,您可以考虑添加方法的UIImageView+AFNetworking类别

setImageWithURLRequest:placeholderImage:success:failure:

UIImageView

答案 2 :(得分:0)

您的代码没有任何问题(假设您确认它有效)。仅仅因为其他人使用NSURLConnection并且相关并不会使你的错误。

要使用活动指示器,请执行以下操作:

-(void)loadImages
{
  UIActivityIndicator *indicator = ...

  ...
  [indicator startAnimating];
  image1 = [UIImage imageWithData:[NSData dataWithContentsOfURL:imgUrl1]];
  image2 = [UIImage imageWithData:[NSData dataWithContentsOfURL:imgUrl2]];
  [indicator stopAnimating];
}

小尼特 - 我亲自使用:

   cell.imageView.image = (0 == indexPath.row ? image1 : image2)
因为没有人似乎欣赏C'条件表达'。结束小尼特。