在“背景”中下载UIImage

时间:2011-10-31 20:08:10

标签: objective-c cocoa-touch

基本上我正在制作一个从网上下载的图片库。

所以 - 当用户滚动时,会下载新图像。

请注意,代码非常简单,只是为了向您展示我的意思

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
        // If new page then:
        [self loadNextPicture];
}

-(void)loadNextPicture
{
   NSString *url=@"http://www.example.com/image.png";
        NSURL *imageURL = [NSURL URLWithString:url];
        NSData *imageData = [NSData dataWithContentsOfURL:imageURL];
        UIImage *nextImage = [UIImage imageWithData:imageData];
        myUIImageView.image=nextImage;

}

我的问题是,每次用户滚动到新页面时,应用程序会在下载图像时冻结大约一秒钟。有没有办法可以在后台下载它,以便下载时应用程序不会冻结?

对这件事情表达每一个想法。

Andreas:)

4 个答案:

答案 0 :(得分:2)

[self performSelectorInBackground:@selector(loadNextPicture) withObject:nil];

NSObject Class Reference

答案 1 :(得分:0)

此小类别会将图像加载到背景中,并在图像准备就绪后显示。

@interface UIImageView (BackgroundUrlImage)
- (void)loadURL:(NSURL *)url;
- (void)loadURLWithString:(NSString *)urlString;
- (void)backgroundLoadURL:(NSURL *)url;
- (void)backgroundLoadURLWithString:(NSString *)urlString;
@end

@implementation UIImageView (BackgroundUrlImage)
- (void)loadURL:(NSURL *)url
{
    NSError* error = nil;
    NSData *imageData = [[NSData alloc] initWithContentsOfURL:url options:0 error:&error];
    // TODO: check error!
    [imageData release];
    UIImage *image = [[UIImage alloc] initWithData:imageData];
    [self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
    [image release];
}
- (void)loadURLWithString:(NSString*)urlString
{
    NSURL *url = [NSURL URLWithString:urlString];
    if (url != nil)
    {
        [self loadURL:url];
    }
}
- (void)backgroundLoadURL:(NSURL *)url
{
    [self performSelectorInBackground:@selector(loadURL:) withObject:url];
}
- (void)backgroundLoadURLWithString:(NSString *)urlString
{
    NSURL *url = [NSURL URLWithString:urlString];
    if (url != nil)
    {
        [self backgroundLoadURL:url];
    }
}
@end

在您的示例代码中,您现在可以将loadNextPicture减少为:

- (void)loadNextPicture
{
     NSString *url=@"http://www.example.com/image.png";
     [myUIImageView backgroundLoadURLWithString:url];
}

答案 2 :(得分:0)

使用NSURLConnection以异步方式加载数据。

答案 3 :(得分:-1)

您需要使用NSOperation执行此操作,以便它在与UI线程不同的线程上发生。如果您愿意,可以使用AllSeeingI(http://allseeing-i.com/ASIHTTPRequest/)或AFNetworking等库。