Asynchronous UITableViewCells和NSURLConnection

Asynchronous UITableViewCells和NSURLConnection,asynchronous,uitableview,nsurlconnection,reuseidentifier,Asynchronous,Uitableview,Nsurlconnection,Reuseidentifier,我有一个自定义UITableViewCell,当用户单击按钮时,我向服务器发出请求并更新该单元格。我使用NSUrlConnection执行此操作,所有操作都很好(这都是在cell类中完成的),一旦返回,它将触发一个委托方法,tableivew控制器将处理此操作。但是,当我在tableview中创建单元格时,我使用了出列方法并重用了我的单元格。因此,如果一个单元触发了一个异步nsurlconnection,并且在这个过程中该单元得到了重用,那么这会反过来擦除当前连接吗?我只是想确保如果单元被重用,

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

您可以自定义
UITableViewCell
的行为,方法是将其子类化并重写
-perpareForReuse
方法。在这种情况下,我建议在单元退出队列时销毁连接。如果连接仍应继续运行,则需要删除对它的引用(将其设置为
nil
),并在其他位置处理其委托方法。

保留连接的引用或要在单元格中显示的任何数据都不是一个好主意,不管你在事后花了多少精力来解决出现的问题。你的方法永远不会可靠

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

在设计应用程序时,最好记住MVC:单元格只是显示模型数据的一种方式,而不是其他方式。这是建筑设计中的景观

为此,表视图代理需要检索模型的属性,该属性应显示在特定行中,并设置单元格。该模型封装了网络连接。控制员将负责管理和更新变更通知并处理用户输入

几个苹果示例提供了关于这个主题的更多细节,并且有一个关于MVC的很好的介绍,请参考图!)

“你的第二个iOS应用程序:故事板”也有一个创建“数据控制器类”的分步说明。非常有用


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

好的,谢谢您提供的信息!如果我建立了一个异步nsurlconnection,当调用didFinishLoading方法时,我在这个方法中写的东西会在主线程中被调用,还是仍然在单独的线程中被调用?委托方法将在安排连接的线程上执行。通常,连接将在运行循环上调度,但线程和运行循环之间存在1:1的关系。(您还可以在NSOperationQueue上安排连接-您将在文档中找到有关该主题的更多信息)。从委托方法中,您可以分派到任何其他队列,例如,分派到主队列,其块/操作将在主线程上执行。好的,非常感谢您提供的信息。如果我想将一些代码分派回主线程,那么使用dispatch_async(dispatch_get_main_queue(),^{//do work here})是否正确;是的,这是正确的。或者,您可以使用PerformSelect*族方法将方法调度到另一个线程(包括主线程)。我建议使用dispatch lib和queues,除非您需要仅使用PerformSelect*获得的功能。