很快,我就有了一个NSDictionary
我需要在我的UITableView
. 每个单元格都有一个标题和一个图像。我成功地做到了这一点,尽管滚动滞后,因为看起来细胞每次进入屏幕时都会下载它们的图像。我搜索了一下,发现SDWebImage
在github上。这使得滚动滞后消失了。我不完全确定它做了什么,但我相信它做了一些缓存。但!每次我第一次打开应用程序时,我都看不到任何图像,我必须向下滚动并备份它们才能到达。如果我用主页按钮退出应用程序,然后再次打开,那么似乎缓存正在工作,因为屏幕上的图像是可见的,但是,如果我向下滚动一个单元格,则下一个单元格没有图像。直到我滚动过去并备份,或者如果我点击它。这是缓存应该如何工作的吗?或者缓存从网络下载的图像的最佳方法是什么?图像更新很少,所以我几乎只是将它们导入项目,但我希望有可能在不上传更新的情况下更新图像..
是否不可能在启动时从缓存中加载整个 tableview 的所有图像(假设缓存中有东西)?这就是为什么我有时会看到没有图像的细胞?
是的,我很难理解缓存是什么。
- 编辑 -
我只使用相同尺寸(500x150)的图像进行了尝试,并且纵横比错误消失了,但是当我向上或向下滚动时,所有单元格上都有图像,但起初它们是错误的。单元格在视图中停留几毫秒后,就会出现正确的图像。这非常烦人,但也许它必须是这样的?..它似乎一开始从缓存中选择了错误的索引。如果我滚动缓慢,那么我可以看到图像从错误的图像闪烁到正确的图像。如果我快速滚动,那么我相信始终可以看到错误的图像,但由于快速滚动,我无法判断。当快速滚动变慢并最终停止时,仍然会出现错误的图像,但在停止滚动后会立即更新为正确的图像。我也有一个习惯UITableViewCell
上课,但我没有做任何大的改变..我还没有仔细检查我的代码,但我想不出可能有什么问题..也许我有一些错误的顺序..我有用 java、c#、php 等编写了很多程序,但我很难理解 Objective-c,所有的.h
和.m
......我也有
@interface FirstViewController : UITableViewController{
/**/
NSCache *_imageCache;
}
(在其他变量中)在FirstViewController.h
. 这不正确吗?
这是我的cellForRowAtIndexPath
。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"hallo";
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSMutableArray *marr = [hallo objectAtIndex:indexPath.section];
NSDictionary *dict = [marr objectAtIndex:indexPath.row];
NSString* imageName = [dict objectForKey:@"Image"];
//NSLog(@"url: %@", imageURL);
UIImage *image = [_imageCache objectForKey:imageName];
if(image)
{
cell.imageView.image = image;
}
else
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString* imageURLString = [NSString stringWithFormat:@"example.com/%@", imageName];
NSURL *imageURL = [NSURL URLWithString:imageURLString];
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:imageURL]];
if(image)
{
dispatch_async(dispatch_get_main_queue(), ^{
CustomCell *cell =(CustomCell*)[self.tableView cellForRowAtIndexPath:indexPath];
if(cell)
{
cell.imageView.image = image;
}
});
[_imageCache setObject:image forKey:imageName];
}
});
}
cell.textLabel.text = [dict objectForKey:@"Name"];
return cell;
}