【问题标题】:NSURLConnection delay leads to an empty UItableViewCell without the pictureNSURLConnection 延迟导致空的 UItableViewCell 没有图片
【发布时间】:2013-12-29 05:37:57
【问题描述】:

我的应用程序通过异步 (NSURLConnection) 连接下载用户的 Facebook 个人资料图片,以便它可以在自定义的 UITableViewCell 上显示个人资料图片。问题是;自定义 tableViewCell 是在图片下载之前创建的,因此延迟会导致没有图片的空 tableViewCell。我怎么解决这个问题?

我的方法是通过在“connectionDidFinishLoading”方法中使用(for-in 枚举)和(每个单元格的标签)来到达每个单元格。

各位,你们觉得我的方法怎么样,有没有更好的方法???

感谢您的帮助, E.

【问题讨论】:

  • 请编写任何代码...例如 cellForRowAtIndexPath 和 connectionDidFinishLoading
  • 请发布您的代码。

标签: ios xcode asynchronous uitableview nsurlconnection


【解决方案1】:

由于 UITableViewCell 重用,尝试标记和循环遍历您的单元格以查找匹配项将不起作用。内存中只有你在屏幕上看到的一样多的单元格,这些单元格被回收以显示不同的数据。因此,您将无法为表格视图中的每一行创建标签,因为表格视图仅使用少数几个单元格。

您应该做的是创建一个UITableViewCell 子类,它知道如何异步下载并显示在图像本身中。使用UIImageView category from AFNetworking 非常适合做这样的事情,而不必自己管理 URL 连接。在你的 cell 子类中导入这个类别,并编写一个调用setImageWithURL: 的方法来异步下载和显示图像。另外,确保重载 UITableViewCell 方法prepareForReuse,您应该在图像视图上调用cancelImageRequestOperation。这样,如果在下载完成之前重新使用单元格,则下载图像的请求将被取消。

【讨论】:

  • 这种方法可能适用于图像较小且表中行数不多的许多用例 - 但它远非“完美”。事实上,如果表有大量的行,并且用户正在快速滚动它,那么你就发起了针对服务器的完美 DOS 攻击;)。在实践中,您几乎总是需要更复杂的解决方案。可以使用最大并发请求数有限但也不是最优的网络队列来缓解这个问题。
  • 用户滚动得越快,每个单元格被重用和取消请求的速度就越快。排队肯定会减少发出的请求,但我认为加上缓存可以防止这成为完美的 DOS 攻击,尤其是当我们谈论 Facebook 时
  • 持保留态度 ;) 但是想象一下下面这个人为的例子:用户按要求快速滚动以取消每个已经启动的请求。我们可以放心地假设服务器响应图像的任务由于连接取消而无法取消。因此,服务器发送该图像。假设,每秒可以启动和取消 100 个请求(对我来说似乎可行)。在客户端,响应不会缓存在 URL 缓存中(但可能在代理上)。每秒发送 100 张图像对于服务器来说并不是一项轻松的任务。将其与 N 个用户相乘;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-23
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多