从远程JSON文件设置UITableViewCell数据

时间:2011-09-26 05:35:35

标签: json ios4 asynchronous uitableview

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

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

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

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

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

2 个答案:

答案 0 :(得分:4)

我将从以下方法开始:

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

  • 数据服务的路径,
  • 服务呼叫“状态”(空闲,等待,完成,错误),
  • 天气信息(来自服务电话退回的JSON)

当您第一次显示表格时,您需要:

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

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

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

当每个服务完成并调用委托时,它会将数据发送到ViewController,然后ViewController将更新数组并启动UITableView更新。

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

  • 如果您的单元格几何变化,您很可能需要重绘整个表格;我不禁想到50个同步UITableView重绘会为你的应用做什么,所以你可能需要设置一个时间阈值来“块”更新并更智能地处理绘图。
    [theTableView reloadData]将导致重新查询并重新绘制整个表。

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

http://iosdevelopertips.com/cocoa/understanding-reload-repaint-and-re-layout-for-uitableview.html处对setNeedsDisplaysetNeedsLayout和'reloadData'进行了很好的解释。

How to refresh UITableViewCell?

有一个相关的SO问题

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

答案 1 :(得分:2)

我现在在搜索多个服务器时这样做。我使用Core Data,但您可以使用NSMutableArray来累积JSON响应。

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

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

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

我这样做,在iPad上求助和重新加载表所花费的时间是微不足道的。如果你不采取行动,它应该更快。


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