表视图与图像,慢负载和滚动

时间:2010-11-01 17:39:23

标签: iphone

我今天尝试实施了大约30个教程,但却无法使用。

我的问题是我通过JSON文件加载我的信息,将数据添加到NSMutableArray,然后使用表来显示它。当我没有图像时,它工作正常,但当我的负载非常慢,滚动非常粘。在今天的调查结果之后,我理解它每次滚动重新加载图像,这就是为什么它的速度很慢。

有人可以将其分解并让我更容易解决这个问题吗?

亚历

4 个答案:

答案 0 :(得分:1)

看看Apple's LazyTableImages example。基本上它归结为

a)重复使用表格单元格

b)仅加载当前可见的图像

答案 1 :(得分:0)

你有点问题,你的问题是敞开的,而你还不够具体。性能问题可能与一堆事情有关。 以下是tableview cell& amp;图像

•在后台线程上加载图像。

•重复使用单元格 - 不要在屏幕上分配任何超出需要的内容

static NSString *CellIdentifier = @"Cell";

    CellClass *cell = (CellClass*)[tv dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) cell = [[[CellClass alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];

•仅绘制与单元格大小相同的图像(即,如果单元格高44像素,则将UIimages保持为44像素)。如果图像较大,则可能必须在从互联网下载后处理图像。

•请勿在您的手机中使用uiimageview。而是创建一个自定义单元格(即子类)并在drawRect:function中绘制图像。

答案 2 :(得分:0)

您应该使用AFNetworkingSDWebImage中的UIImageView类别提供的异步图像检索。这些类别:

  • 非常容易使用(而不是使用UIImageView方法setImage,而是使用其中一个类别'setImageWithURL方法);

  • 提供异步图像检索;

  • 使用NSCache缓存下载的图片,以确保您不必检索刚刚下载的图片;

  • 确保您的用户界面无法为已滚动屏幕的单元格下载图像;以及

  • 利用操作队列来约束并发度(而不是使用可能导致超时失败的GCD全局队列)。

答案 3 :(得分:0)

我有一个叫做RemoteImageHandler的类。这是.h文件:

#import <UIKit/UIKit.h>

@interface RemoteImageHandler : NSObject

- (void)imageForUrl:(NSURL*)url callback:(void(^)(UIImage *image))callback;

+ (RemoteImageHandler *)shared;

@end

.m文件:

#import "RemoteImageHandler.h"

@interface RemoteImageHandler ()

@property (nonatomic, strong) NSMutableDictionary *imageDictionary;

@end

@implementation RemoteImageHandler

- (void)imageForUrl:(NSURL*)url callback:(void(^)(UIImage *image))callback {
    if (!!self.imageDictionary[url]) {
        callback(self.imageDictionary[url]);
    } else {
        dispatch_async(dispatch_get_global_queue(0,0), ^{
            NSData * data = [[NSData alloc] initWithContentsOfURL:url];
            if (data == nil)
                callback(nil);
            dispatch_async(dispatch_get_main_queue(), ^{
                UIImage *image = [UIImage imageWithData:data];
                self.imageDictionary[url] = image;
                callback(image);
            });
        });
    }
}

+ (TQRemoteImageHandler *)shared {
    static TQRemoteImageHandler *shared = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        shared = [[self alloc] init];
    });
    return shared;
}

@end

在我的表视图中,每当我想要一个来自远程位置的图像时(假设这是在cellForRowAtIndexPath中,我使用它:

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier forIndexPath:indexPath];

    [[RemoteImageHandler shared] imageForUrl:someURLCorrespondingToTheImageYouWant callback:^(UIImage *image) {
        cell.imageView.image = image;
    }];

    return cell;
}