我有UITableView代表城市列表(100个城市)。
对于每个城市,我想调用特定的远程(URL)JSON来获取城市的天气信息,并为UITableView中的每个城市单元填充响应数据。
当我运行应用程序时,我想尽快看到我的表,所以我不需要等待所有json响应。我希望信息得到异步(当加载特定的json时,在UITableView中为相应的城市单元设置它的信息)。
注意:对我来说,调用单独的远程JSON文件非常重要。
哪种技术最适合这项任务?
答案 0 :(得分:4)
我将从以下方法开始:
创建一个数据结构来保存城市信息,包括:
当您第一次显示表格时,您需要:
您可能还希望返回带有城市名称(如果已有)的自定义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处对setNeedsDisplay
,setNeedsLayout
和'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响应包含填写表格单元格所需的所有信息。情况可能并非如此。如果不是,您必须将回复与您拥有的其他信息相关联,例如您的计划所呈现的城市列表。