Ios UITableView使用缓存异步加载缩略图图像

Ios UITableView使用缓存异步加载缩略图图像,ios,uitableview,grand-central-dispatch,Ios,Uitableview,Grand Central Dispatch,我正在尝试将远程站点的缩略图加载到UITableView。我希望以异步方式执行此操作,并且我希望为缩略图实现一个poorman缓存。下面是我的代码片段(我将在下面描述有问题的行为): 下面是一些有问题的行为: 加载UITableView时,缩略图不会显示在初始单元格集上。只有当单元格移离屏幕,然后再移回屏幕时,才会显示缩略图 缓存根本不工作。据我所知,它无法将缩略图保存到缓存中。也就是说,这条线失败了: [self.thumbnailsCache setObject:image-forKey:

我正在尝试将远程站点的缩略图加载到UITableView。我希望以异步方式执行此操作,并且我希望为缩略图实现一个poorman缓存。下面是我的代码片段(我将在下面描述有问题的行为):

下面是一些有问题的行为:

  • 加载UITableView时,缩略图不会显示在初始单元格集上。只有当单元格移离屏幕,然后再移回屏幕时,才会显示缩略图

  • 缓存根本不工作。据我所知,它无法将缩略图保存到缓存中。也就是说,这条线失败了:

    [self.thumbnailsCache setObject:image-forKey:thumbnailCacheKey]

  • 正在为每个单元格创建/释放GCD队列。此外,队列名称每次都是相同的。这是坏习惯吗

  • 我希望你们能指出任何你们认为是错误的东西,甚至任何一般的方法评论。谢谢

    更新:
  • 已解决:我添加了一个重新加载rowsatindexpaths的调用,现在缩略图图像加载到显示的初始行上

  • 已解决:它失败的原因是,在另一个线程完成对图像对象的设置之前,它正在将图像对象添加到字典中。我创建了一个实例方法来将对象添加到属性字典中,这样我就可以从块内部调用它,确保在设置图像对象之后添加它

  • 1) 没有显示初始图像的原因是,单元格是使用image=nil进行渲染的,因此它会智能地隐藏图像视图

    2) 你有没有试着把这条线移到你的街区里

    [self.thumbnailsCache setObject:image forKey:thumbnailCacheKey];
    

    3) 这只是区分要调试的队列和从控制台获取信息的一种方法,如果应用程序崩溃,则可以看到队列的名称。这应该不会是一个问题,你有相同的名称,因为它做相同的操作。如果具有相同的逻辑,则不希望在另一个表视图中使用此名称。

    您应该仔细查看。 这正是你想要的。
    SDWebImage也非常快,可以使用多核CPU。

    1)谢谢。在加载图像后,我添加了对该行的reloadRowsAtIndexPaths的调用,缩略图现在在初始加载时显示。2) 我不知道如何使属性在GCD块中可写。如何在声明中添加_u块前缀?我最终创建了一个实例方法来添加到属性字典中。这样我就可以在街区内部调用它了。既然你可以用一个助手来完成所有的工作,为什么还要自己一遍又一遍地做呢?签出UIImageLoader。它非常简单,只需向xcode添加两个文件。如果你使用swift,然后签出AlamofireImage,那就太棒了。
    [self.thumbnailsCache setObject:image forKey:thumbnailCacheKey];