我有一个uitableview,我使用自定义单元格。但是,当我滚动表格视图时,存在一些严重的滞后。当我用图像设置UIImaveView的图像属性时会发生这种情况。我正在从目录中访问图像。但由于文件IO很慢,我使用dispatch_async将图像加载到单独线程上的UIImage对象中。
然而,仍有一些滞后。当我在没有任何图像的情况下向上和向下滚动行时,滚动非常平滑。然而,当行实际上有图像时,存在滞后。动量滚动将停止,然后应用程序变得反应迟钝,然后当图像最终加载时,动量继续从中断。
我不确定导致滞后的原因。起初我以为它与图像太大有关,所以我尝试缩小它。仍然滞后。同样,如果我没有在自定义单元格中设置图像,则没有滞后。但是,当我确实设置它时,有滞后。我不知道如何解决这个问题。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
DHTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kReuseIdentifierGoalCell forIndexPath:indexPath];
[self configureCell:cell forIndexPath:indexPath isForOffscreenUse:NO];
return cell;
}
- (void)configureCell:(DHTableViewCell *)cell forIndexPath:(NSIndexPath *)indexPath isForOffscreenUse:(BOOL)offscreenUse {
if (cell == nil) {
return;
}
[cell setDelegate:self];
PATH_TO_FILE = SQLITE_QUERY_TO_GET_PATH; //some pseudo codes
__weak typeof(sSelf)wSelf = sSelf;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
__strong typeof(wSelf)sSelf = wSelf;
UIImage *unscaled_image = [UIImage imageWithContentsOfFile:PATH_TO_FILE];
UIImage *image = [unscaled_image imageScaledToFitInSize:kCellUIImageSize];
__weak typeof(sSelf)wSelf = sSelf;
dispatch_async(dispatch_get_main_queue(), ^{
__strong typeof(wSelf)sSelf = wSelf;
DHTableViewCell *cell = (id)[sSelf.tableView cellForRowAtIndexPath:indexPath];
if (cell) {
[cell.imageStored setImage:image]; //Commenting this out relieves all lag
}
});
});
}
答案 0 :(得分:0)
@ Calimari328我讨厌如果把它作为答案,因为它并没有真正回答你的问题,但事实是你应该真正做的是用一个库来实现这个目标。例如SDWebImage
示例:
#import <SDWebImage/UIImageView+WebCache.h>
...
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *MyIdentifier = @"MyIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:MyIdentifier] autorelease];
}
// Here we use the new provided setImageWithURL: method to load the web image
[cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
cell.textLabel.text = @"My Text";
return cell;
}
您必须重新考虑这一点,细胞会被重复使用,这意味着每次滚动应用程序时都会尝试再次下载图像。性能如何?记忆?缓存?处理?
正如您所想的那样,它比简单的异步任务复杂得多。幸运的是,有一些开源项目可以实现这一目标。无需重新发明轮子。
请注意,如果您想编写自己的代码,我也不会宣传任何图书馆。您也可以search on the web轻松实现。