将图像加载到UIViewController异步 - 使用代码

时间:2012-02-03 01:00:18

标签: iphone objective-c cocoa-touch

这是用我的viewDidLoad方法

写的
 NSOperationQueue *queue = [NSOperationQueue new];
    NSInvocationOperation *op = [[NSInvocationOperation alloc] 
                                        initWithTarget:self
                                        selector:@selector(downloadImage) 
                                        object:nil];
    [queue addOperation:op]; 

//其他方法中的其余部分;

- (void)downloadImage{
    NSData* imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:person.picURL]];
    UIImage* image = [[UIImage alloc] initWithData:imageData] ;


    [self showImage: image];
}

我尝试在[self showImage: image];之上添加以下代码,最后我得到了一个例外。

1。)[self performSelectorOnMainThread:@selector(showImage:) withObject:image waitUntilDone:NO];

2。)[self performSelectorInBackground:@selector(showImage:) withObject:image];

//这是showImage代码。

- (void)showImage:(UIImage *)img {

    if (img != nil) 
    {    
        myImageView = [[UIImageView alloc] initWithImage:img];

        myImageView.frame = CGRectMake(20, 20, 132, 124);

        [scrollView addSubview:myImageView];

        [pictureOfPerson setImage:img];        
    }
}

我正在尝试Asynchronously下载图片并对其进行缓存。图像被下载Asynchronously但我不确定它是否被缓存。

1。)如何缓存图像并在视图再次加载时使用它

2。)当图像下载时,如果我点击另一个视图怎么办?然后我需要停止下载。我该怎么写这段代码。我知道我必须在viewDidDissapear方法中编写它。

3。)我的代码是否正确。我错过了什么或有没有更好的方法来做到这一点?如果是这样的教程或一些示例代码,请

2 个答案:

答案 0 :(得分:1)

您可以使用:SDWebImage

答案 1 :(得分:1)

我使用GCD下载图片。它比NSOperation简单易用。这是一个例子:

UIImage *personPicture;
personPicture = [self.imageCache objectForKey:person.picURL];
if (!personPicture) {
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:person.picURL]];
        personPicture = [UIImage imageWithData:imageData];
        [self.imageCache setObject:imageData forKey:person.picURL];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self showImage:personPicture];
        });
    });
}
else {
    [self showImage:personPicture];
}

您可以使用类似NSMutableDictionary的类属性来存储UIImage数据并将其与您的URL相关联。如果它存在,请使用它,如果没有,请下载图像。

CNC中 添加代码来处理缓存。