我使用AssetsLibrary得到了iphone的所有图像。我在imageview中传递UIImage对象并在scrollview中显示图像。 iphone中有超过200个图像,我必须垂直滚动显示所有图像而不使用分页。这需要大量时间来显示图像,并且还存在内存问题。在scrollview中是否有任何延迟加载iphone图像的代码
答案 0 :(得分:4)
我最近一直在研究这个问题,并在网上检查了大量的示例代码。它没有真正做到延迟加载(尽管有声称)或者比我愿意忍受的更复杂(不必要的花里胡哨)。 PhotoPicker的Apple WWDC视频似乎显示延迟加载,但似乎更专注于预切片图像的平铺,因此没有多大帮助。
我最终做的是一次加载所有aspectThumbnails
,因为它们很小并且不占用那么多内存,然后根据需要加载fullScreenImage
表示{ {1}}并为屏幕外的imageView重新加载scrollViewDidEndDecelerating
。效果非常流畅,视觉上,图像有点粗糙,然后快速(通过背景加载)被更高分辨率的图像取代。
它可能会使用更多细化 - 可能为当前页面加载全分辨率图像+1& -1。我还没有解决这个问题。另外,我不完全确定我是否使用了最佳块 - 但没有出错。
我从Segue中调用它并在我的根viewController上的aspectThumbnail
方法中设置assetsArray
(ALAsets的NSArray)。
prepareForSegue:
// ScrollViewController.m
// ScrollViewController.h
#import <UIKit/UIKit.h>
#import <AssetsLibrary/AssetsLibrary.h>
@interface ScrollViewController : UIViewController <UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (strong, atomic) ALAssetsLibrary* assetLibrary;
@property (nonatomic,strong)NSMutableArray* assetsArray;
@end
答案 1 :(得分:1)
您可以使用GCD块和大中央调度。 在.h文件中声明它
dispatch_queue_t imageQueue_;
创建NSmutableDictionary
@property (nonatomic, strong) NSMutableDictionary *thumbnailsCache;
使用以下代码显示图片。
NSString *thumbnailCacheKey = [NSString stringWithFormat:@"cache%d",imageIndex];
if (![[self.thumbnailsCache allKeys] containsObject:thumbnailCacheKey]) {
// thumbnail for this row is not found in cache, so get it from remote website
__block NSData *image = nil;
dispatch_queue_t imageQueue = dispatch_queue_create("queueForCellImage", NULL);
dispatch_async(imageQueue, ^{
NSString *thumbnailURL = [NSString stringWithFormat:@"%@",deal_Class.deal_imageUrl];
image = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"Your URL"]];
dispatch_async(dispatch_get_main_queue(), ^{
imageView.image = [UIImage imageWithData:image];
if (image) {
[self.thumbnailsCache setObject:image forKey:thumbnailCacheKey];
}
});
});
// dispatch_release(imageQueue);
} else {
// thumbnail is in cache
NSData *image = [self.thumbnailsCache objectForKey:thumbnailCacheKey];
dispatch_async(dispatch_get_main_queue(), ^{
imageview.image = [UIImage imageWithData:image];
});
}
答案 2 :(得分:1)
有很多教程可供选择。
让我指出其中一些:
How To Use UIScrollView to Scroll and Zoom Content
Scroll Lazy Image Load for iOS
如果您在使用某人的代码时没有问题 DMLazyScrollView : Lazy Loading UIScrollView (with infinite page scrolling)
答案 3 :(得分:0)
您应该只在当前页面上加载一个或两个方向的图像。仅在需要时加载图像,保留有限的缓冲区,并在图像离开缓冲区后删除图像。例如,如果图像3和4在屏幕上,则应加载图像1,2,5和6。当用户滚动图像5和6在屏幕上时,它将保持图像3和4加载,将从其内存中删除1和2,并将加载7和8以创建新的缓冲区。