我今天尝试实施了大约30个教程,但却无法使用。
我的问题是我通过JSON文件加载我的信息,将数据添加到NSMutableArray,然后使用表来显示它。当我没有图像时,它工作正常,但当我的负载非常慢,滚动非常粘。在今天的调查结果之后,我理解它每次滚动重新加载图像,这就是为什么它的速度很慢。
有人可以将其分解并让我更容易解决这个问题吗?
亚历
答案 0 :(得分:1)
答案 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)
您应该使用AFNetworking或SDWebImage中的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;
}