将数据异步加载到表格视图单元格中的正确方法/接受标准是什么?

Dou*_*ith 9 core-data objective-c uitableview grand-central-dispatch ios

许多应用程序,如Tweetbot,Twitterrific,Alien Blue等,显示来自API的图像似乎以异步方式加载它们.似乎初始可视图像是同步加载的 - 即初始可视单元格在它们的图像准备好之前不会显示 - 但是当进一步向下滚动到初始可查看单元格之后,似乎这些新单元格的图像是独立加载的.初始同步负载.

例如,当用户在Twitter应用程序中加载推文时,直到用户头像的图像加载后才会显示最初的六条或七条推文,但之后的40多条推文(不是'在用户滚动之前可见,我们不必等待这些图像加载以显示初始单元格,因为它们甚至还不可见.似乎大多数应用程序允许这些图像独立加载,使初始推文显示得更快.

我很困惑如何最好地实现这一点,例如,如果大多数开发人员采用标准方式来做这件事,我不知道.

我习惯于通过从响应中向Core Data提供对象来使用Core Data,然后NSFetchedResultsController在表视图中显示它们.然而,这会产生负面影响,要求在显示单元格之前将所有内容完全加载并存储在对象中.这意味着如果API返回一个图像链接给我,并且我想在单元格中显示该图像,我必须将链接加载到a UIImage并将其添加到Core Data.

所以我的问题基本归结为: Tweetbot,Twitterrific,Alien Blue等热门应用程序如何处理需要加载大量图像和数据的表格视图,但仍允许非常快速的加载,而不必加载不必要的数据,仍然保持高滚动性能?

Mar*_*rra 5

有很多解决方案,你可以在这里找到很多关于堆栈溢出的解决方案.

基本思想是你想要在一个块或一个块中加载图像NSOperation.我更喜欢一个NSOperation因为你可以取消它们,当一个单元格滚出屏幕时这很有用.

我建议使用控制器来管理您的图像队列.您的表格单元格从控制器请求图像,如果控制器具有图像,则立即返回该图像.如果没有,则返回nil并获取图像.

从这里可以选择.您可以使用块在检索图像时回调.我不是那种粉丝,但它很受欢迎.我喜欢在NSNotification收到图像时使用a ,并且单元格会监听NSNotification填充图像.

我在github上有一个相当复杂的样本,可以处理这个以及更多.它位于我的共享存储库中,网址http://github.com/ZarraStudios/ZDS_Shared.主类被称为ZSAssetManager.

注意:此示例代码已有几年的历史,因此尚未ARC准备就绪,需要进行一些调整.它也可能比您正在寻找的更复杂,因为它也处理带宽检测和反应.但是,它向您展示了生产/高质量应用程序处理异步加载图像的功能.

请享用.