我有一个可以加载大约 5 张图像的屏幕,但它们是巨大的图像。现在我使用一个
NSURLRequest
和一个:
connectionDidFinishLoading
..用于回调告诉我每个图像何时加载。
问题是图像会一张一张地弹出。有没有办法让它在加载时显示图像?
谢谢
我有一个可以加载大约 5 张图像的屏幕,但它们是巨大的图像。现在我使用一个
NSURLRequest
和一个:
connectionDidFinishLoading
..用于回调告诉我每个图像何时加载。
问题是图像会一张一张地弹出。有没有办法让它在加载时显示图像?
谢谢
您需要执行此操作的内容可作为 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);
然后,您使用图像源获取最终图像,您就完成了。
加载时显示,我不认为加载时UIImageView
可以加载UIImages
不完整的数据。我会选择
AsyncImageView,它可以处理异步加载图像的所有负担。UIActivityIndicator
而且已经添加到它。所以它会更加用户友好
您可以子类化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);
}
}
使用块和 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"]];
}
});
});
}