0

我有一个自定义 UITableViewCell,当用户单击按钮时,我向服务器发出请求并更新单元格。我使用 NSUrlConnection 执行此操作,并且一切正常(这一切都在单元类中完成),一旦它返回,它就会触发一个委托方法,并且 tableivew 控制器会处理这个。但是,当我在 tableview 中创建单元格时,我使用 dequeue 方法并重用我的单元格。因此,如果一个单元格触发了一个异步 nsurlconnection,并且该单元格在这仍在进行时被重用,这会反过来擦除当前连接吗?我只是想确保如果单元被重用,分配给单元的实际内存仍然存在,因此连接可以履行其职责?

4

2 回答 2

0

保留对连接的引用或要在单元格中显示的任何数据绝不是一个好主意,无论之后您为解决出现的问题付出了多少努力。你的方法永远不会可靠。

在您的情况下,如果用户快速上下滚动表格视图,您的应用程序将启动并可能取消数十个连接,但永远不会完成加载某些内容。这将是一个糟糕的用户体验,并且可能会使应用程序崩溃。

最好在设计应用时考虑MVC:单元格只是显示模型数据的一种方式,仅此而已。这是这个建筑设计中的视图。

为此,Table View Delegate 需要检索模型的属性,这些属性应为特定行显示并设置单元格。该模型封装了网络连接。控制器将负责管理和更新更改通知并处理用户输入。

一些 Apple 示例提供了有关此主题的更多详细信息,并且有一个关于 MVC 的很好的介绍,请看图!;)

http://developer.apple.com/library/ios/#documentation/general/conceptual/devpedia-cocoacore/MVC.html

“你的第二个 iOS 应用程序:故事板”也有一步一步的解释来创建“数据控制器类”。很有用!

现在,当使用更新模型的 NSURLConnection 时,它可能会变得更复杂一些。您正在处理“延迟初始化模型”。也就是说,它们可能会在控制器访问属性时提供一些“占位符”数据,而不是在尚不可用时提供“真实”数据。然而,模型会启动一个网络请求来加载它。当它最终被加载时,模型必须以某种方式通知表视图控制器。这里的棘手部分是不要弄乱模型和表视图之间的同步问题。模型的属性必须在主线程上更新,并且在发生这种情况时,必须保证表视图不会访问模型的属性。有一些示例演示了实现此目的的一些技术。

于 2013-05-25T19:22:38.617 回答
0

您可以UITableViewCell通过子类化并覆盖-perpareForReuse方法来自定义 a 的行为。在这种情况下,我建议在单元出列时破坏连接。如果连接仍应继续进行,则需要删除对它的引用(将其设置为nil)并在其他地方处理其委托方法。

于 2013-05-25T14:02:51.750 回答