【问题标题】:Set UITableViewCell data from remote JSON file从远程 JSON 文件设置 UITableViewCell 数据
【发布时间】:2011-11-24 22:39:25
【问题描述】:

我有 UITableView 代表城市列表(100 个城市)。

对于每个城市,我想调用特定的远程 (URL) JSON 来获取城市的天气信息并填充 UITableView 中每个城市单元格的响应数据。

当我运行应用程序时,我希望尽快看到我的表,所以我不需要等待所有 json 响应。我希望信息得到异步(当加载特定的json时,在UITableView中为相应的城市单元格设置它的信息)。

注意:调用单独的远程 JSON 文件对我来说很重要。


哪种技术最适合这项任务?

【问题讨论】:

    标签: json ios4 asynchronous uitableview


    【解决方案1】:

    我将从以下方法开始:

    创建一个数据结构来保存城市信息,包括:

    • 数据服务路径,
    • 服务调用“状态”(空闲、等待、完成、错误),
    • 天气信息(来自服务调用返回的 JSON)

    当你第一次展示表格时,你会想要:

    • 初始化您的数组(上述数据结构的),
    • 异步启动每个服务调用,
    • 将每行(城市)状态设置为等待。

    您可能还希望返回带有城市名称(如果您已经拥有)和旋转活动指示器的自定义 UITableCellView。这将是您获得快速加载时间(不等待服务完成)并给出数据正在加载的视觉指示的最佳选择。

    每个服务调用都应该使用 ViewController 作为其委托;您将需要一个关键字段,以便当服务返回时,它们可以识别与它们关联的行/城市。

    随着每个服务完成并调用委托,它会将数据发送到 ViewController,ViewController(反过来)将更新数组并启动 UITableView 更新。

    在我看来,UITableView 的更新是最困难的部分。通常,单元格在可见时会被绘制或更新;该表预取所有可见单元格的几何图形,然后在准备好绘制每个单元格时查询实际内容;因此,您更新单元格的策略将取决于您的表格的使用方式。

    • 如果您的单元格几何形状发生变化,您很可能需要重新绘制整个表格;想想 50 次同时重绘 UITableView 将为您的应用程序做什么,我不寒而栗,因此您可能需要设置一个时间阈值来“分块”更新并更智能地处理绘图。
      [theTableView reloadData] 将导致整个表格重新查询并重新绘制。

    • 如果您的单元格几何形状没有改变,您可以尝试更严格地仅更新可见单元格(不可见的单元格不是问题,因为它们的数据将在它们变为可见时被查询)。
      [theTableView visibleCells] 返回可见单元格数组;当您的服务调用返回时,您可以更新数据,然后搜索数组以查看相关单元格是否可见;如果是,您可能需要向特定的 UITableCellView 发送 setNeedsDisplay 消息。

    setNeedsDisplaysetNeedsLayout 和“reloadData”在http://iosdevelopertips.com/cocoa/understanding-reload-repaint-and-re-layout-for-uitableview.html 上有很好的解释。

    How to refresh UITableViewCell? 有一个相关的 SO 问题

    最后,您可能希望在服务委托错误例程中实现一些更新逻辑,以免创建无休止的旋转活动指示器。

    【讨论】:

    • 谢谢,非常详细的解释。您是否有类似的现有工作示例?会很棒
    • @AlmasAdilbek 我可能有流程不同部分的样本,但不是整个流程的样本。有没有特别的部分?
    • 我刚刚看到一篇 Jeff Lamarche 博客文章,其中介绍了异步下载资源的正确内容:iphonedevelopment.blogspot.com/2010/05/…。值得一读。
    【解决方案2】:

    我现在在搜索多个服务器时执行此操作。我使用 Core Data,但您可以使用 NSMutableArray 来累积 JSON 响应。

    每次从您的一台服务器完成接收日期时(例如,执行 connectionDidFinishLoading 时),获取 JSON 数据对象并将其添加到 NSMutableArray(我们称之为 weatherResults)(添加它使用 addObject 方法)。您可能希望在将 JSON 添加到可变数组 weatherResults 之前将其转换为 NSDictionary。

    假设您的 dataSource 委托方法引用了 weatherResults NSMutableArray 中的内容(例如,使用 [weatherResults count] 从数组大小中获取行数),您可以执行以下操作:

    将对象插入数组后,您可以简单地在 dataSource 控制器中调用 reloadData。当每个新的 JSON 结果到达时,您将看到表更新。结果应在输入时附加到表的底部。如果您想在每次 JSON 结果到达时对 NSMutableArray 进行排序,您也可以这样做。

    我这样做了,在我的 iPad 上重新加载表格所需的时间是微不足道的。如果不采取措施,应该会更快。


    顺便说一下,在这个解释中,我假设 JSON 响应包含您需要填写表格单元格的所有信息。情况可能并非如此。如果不是,您必须将响应与您拥有的其他信息相关联,例如您的程序正在呈现的城市列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-16
      • 2019-06-13
      • 2017-11-11
      • 2018-06-07
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多