0

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

NSURLRequest

和一个:

 connectionDidFinishLoading

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

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

谢谢

4

4 回答 4

2

您需要执行此操作的内容可作为 CGImageSource 方法获得。

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

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

CGImageSourceRef imageSourcRef = CGImageSourceCreateIncremental(dict);

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

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

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

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

当您获得最终数据时,您会更新上次的图像源:

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

然后,您使用图像源获取最终图像,您就完成了。

于 2012-09-27T23:00:55.647 回答
1

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

于 2012-09-27T19:38:23.610 回答
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);
            }
    }
于 2013-12-16T09:04:54.600 回答
0

使用块和 GCD 的 dispatch_async 方法。

看这个例子:

//communityDetailViewController.h

@interface communityDetailViewController : UIViewController {

UIImageView *imgDisplay;
UIActivityIndicatorView *activity;

// the dispatch queue to load images
dispatch_queue_t queue;

}

@结尾

//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"]];
        }
    });
});

}

于 2012-09-27T20:15:55.370 回答