从URL加载图像但逐步显示它

时间:2012-09-27 19:23:53

标签: objective-c ios

我有一个可以加载5张图像的屏幕,但它们是巨大的图像。现在我用

NSURLRequest

和a:

 connectionDidFinishLoading

..用于回调告诉我每个图像的加载时间。

问题是图像会一个接一个地弹出。有没有办法让它在加载时显示图像?

由于

4 个答案:

答案 0 :(得分:2)

你需要做的就是CGImageSource方法。

首先,使用异步NSURLConnection来获取数据。您将收到的数据在到达时添加到NSMutableData对象,因此数据对象变得越来越大,直到完成。

您还可以创建渐进式图像源:

CGImageSourceRef imageSourcRef = CGImageSourceCreateIncremental(dict);

你会在这里和google上找到很多例子如何设置所需的字典。

然后,当数据到达时,将TOTAL数据对象传递给此方法:

CGImageSourceUpdateData(imageSourcRef, (__bridge CFDataRef)data, NO); // No means not finished

然后,您可以向图像源询问图像,该图像在下载图像时将是部分图像。使用CGImage,您可以创建UIImage。

获得最终数据后,上次更新图像源:

CGImageSourceUpdateData(imageSourcRef, (__bridge CFDataRef)data, YES);

然后使用图像源获取最终图像并完成。

答案 1 :(得分:1)

在加载时显示它,我认为UIImageView在加载时不会加载UIImages数据不完整。我会选择  AsyncImageView, 它可以处理加载图像异步的所有负担。另外UIActivityIndicator已添加到它。所以它将更加用户友好

答案 2 :(得分:0)

使用块和GCD的dispatch_async方法。

看看这个例子:

//communityDetailViewController.h

@interface communityDetailViewController:UIViewController {

UIImageView *imgDisplay;
UIActivityIndicatorView *activity;

// the dispatch queue to load images
dispatch_queue_t queue;

}

@end

// communityDetailViewController.m

- (void)loadImage

{

[activity startAnimating];

NSString *url = @"URL the image";

if (!queue) {
    queue = dispatch_queue_create("image_queue", NULL);
}

dispatch_async(queue, ^{
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
    UIImage *anImage = [UIImage imageWithData:data];

    dispatch_async(dispatch_get_main_queue(), ^{
        [activity stopAnimating];
        activity.hidden = YES;
        if (anImage != nil) {
            [imgDisplay setImage:anImage];
        }else{
            [imgDisplay setImage:[UIImage imageNamed:@"no_image_available.png"]];
        }
    });
});

}

答案 3 :(得分:0)

您可以继承UIImageView并使用此功能。

  -(void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response
    {
        imageData = [NSMutableData data];
        imageSize = [response expectedContentLength];
        imageSource = CGImageSourceCreateIncremental(NULL);
    }

        -(void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data
        {
            [imageData appendData:data];

             CGImageSourceUpdateData(imageSource, (__bridge CFDataRef)imageData, ([imageData length] == imageSize) ? true : false);
            CGImageRef cgImage = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL);
            if (cgImage){
                UIImage* img = [[UIImage alloc] initWithCGImage:cgImage scale:1.0f orientation:UIImageOrientationUp];
                dispatch_async( dispatch_get_main_queue(), ^{
                    self.image = img;
                });
                CGImageRelease(cgImage);
            }
    }