【问题标题】:UITableViewCells and NSURLConnectionUITableViewCells 和 NSURLConnection
【发布时间】:2013-05-20 23:00:41
【问题描述】:

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

【问题讨论】:

    标签: asynchronous uitableview nsurlconnection reuseidentifier


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多