我有一个可以加载5张图像的屏幕,但它们是巨大的图像。现在我用
NSURLRequest
和a:
connectionDidFinishLoading
..用于回调告诉我每个图像的加载时间。
问题是图像会一个接一个地弹出。有没有办法让它在加载时显示图像?
由于
答案 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);
}
}