Uiscrollview懒加载

时间:2013-02-02 07:18:41

标签: iphone ios uiscrollview lazy-loading

我使用AssetsLibrary得到了iphone的所有图像。我在imageview中传递UIImage对象并在scrollview中显示图像。 iphone中有超过200个图像,我必须垂直滚动显示所有图像而不使用分页。这需要大量时间来显示图像,并且还存在内存问题。在scrollview中是否有任何延迟加载iphone图像的代码

4 个答案:

答案 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以创建新的缓冲区。