3

亲爱的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,但遇到了一些问题。我了解我的代码不正确。我看到人们使用NSURLRequestandNSURLConnection来加载图像并添加UIActivityIndicator.

你能告诉我,加载这样的图像最标准的方法是什么?我应该重写什么?

4

3 回答 3

3

我建议您使用 AsyncImageView 一个漂亮的实现,它由 iCarousel 之父 Nicklockwood 提供。

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];
 });
 }); 
于 2013-04-07T18:12:08.333 回答
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.

于 2013-04-07T18:06:32.000 回答
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 '条件表达式'。结束小尼特。

于 2013-04-07T18:08:08.623 回答