我有一个自定义UITableViewCell,当用户点击一个按钮时,我向服务器发出请求并更新单元格。我使用NSUrlConnection执行此操作并且一切正常(这都是在单元类中完成的)并且一旦返回它就会触发委托方法并且tableivew控制器处理此问题。但是当我在tableview中创建单元格时,我使用dequeue方法并重用我的单元格。因此,如果一个单元已经触发了一个异步的nsurlconnection,并且该单元在仍在继续时被重用,那么这又会擦除当前的连接吗?我只是想确保如果重用单元格,分配给单元格的实际内存仍然存在,那么连接可以履行其职责吗?
答案 0 :(得分:0)
您可以通过对UITableViewCell
进行子类化并覆盖-perpareForReuse
方法来自定义nil
的行为。在这种情况下,我建议在单元格出列时销毁连接。如果连接仍然继续,则需要删除对它的引用(将其设置为{{1}})并在其他地方处理其委托方法。
答案 1 :(得分:0)
保持连接的引用或要在单元格中显示的任何数据永远不是一个好主意,无论您在之后为解决出现的问题付出了多少努力。你的方法永远不会可靠。
在您的情况下,如果用户快速上下滚动表格视图,您的应用程序将启动并可能取消许多连接,但从未完成加载某些内容。这将是一个糟糕的用户体验,并可能使应用程序崩溃。
更好的设计应用 MVC :单元格只是显示模型数据的一种方式,没有别的。这是该建筑设计中的视图。
为此目的,Table View Delegate需要检索Model的属性,该属性应显示在某一行并设置单元格。该模型封装了网络连接。 Controller将负责管理和更新变更通知并处理用户输入。
一些Apple示例提供了有关此主题的更多详细信息,并且有一个关于MVC的很好的介绍,请详细说明! ;)
http://developer.apple.com/library/ios/#documentation/general/conceptual/devpedia-cocoacore/MVC.html
“你的第二个iOS应用程序:故事板”也有一步一步的解释来创建“数据控制器类”。非常有用!
现在,当使用更新模型的NSURLConnection时,它可能会变得有点复杂。您正在处理“延迟初始化模型”。也就是说,当控制器访问属性时它们可能提供一些“占位符”数据,而不是在尚未可用时提供“真实”数据。但是,该模型会启动网络请求以加载它。最终加载时,模型必须以某种方式通知表视图控制器。这里棘手的部分是不要弄乱模型和表视图之间的同步问题。必须在主线程上更新模型的属性,并且在发生这种情况时,必须保证表视图不会访问模型的属性。有一些样本展示了一些实现这一目标的技术。