不久,我有一个NSDictionary
与网址的图像,我需要显示在我的UITableView
。每个单元格都有一个标题和一个图像。我成功地做到了这一点,虽然滚动是滞后的,因为它似乎像细胞每次下载图像时,他们每次进入屏幕。 我搜索了一下,发现github上的SDWebImage
。这使得滚动条消失。我不完全确定它做了什么,但我相信它做了一些缓存。 但是!每次我第一次打开应用程序时,我都会看到没有图像,我必须向下滚动并备份才能到达。如果我用主页按钮退出应用程序,并再次打开,那么它看起来像缓存正在工作,因为屏幕上的图像是可见的,但是,如果向下滚动一个单元格,则下一个单元格没有图像。直到我滚过它并备份,或者如果我点击它。这是缓存应该如何工作?或者什么是缓存从网络下载的图像的最佳方式?这些图像正在被快速更新,因此我接近将它们导入到项目中,但我希望能够更新图像而无需上传更新。在ios应用上缓存图像的最佳方式?
是否无法加载全部图像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;
}
您可以将代码发布到'cellRowRowAtIndexPath'和其他任何可能与此相关的代码中吗?高速缓存只是存储您希望再次访问的内容,以便在更容易到达的地方加速后续访问。在这种情况下,缓存意味着您的应用程序应该在第一次下载它时实际存储每个单元的图像数据,然后在需要显示特定单元时随时重新使用它(这是SDWebImage应该做的工作)您)。 – Dima 2012-07-16 19:56:05
完成。我已经切换出SDWebImage,但仍然得到一些奇怪的结果..有时在滚动时显示错误的图像。 – Sti 2012-07-17 04:46:07
刚刚在第一个'dispatch_async'之前初始化'cell.imageView.image'。 – Rob 2012-07-17 12:42:12