对于在当前显示的iphone tableview中更新数据的长时间运行操作,最佳做法是什么?

时间:2009-06-22 14:59:46

标签: iphone cocoa-touch multithreading uitableview core-location

背景

我有一个显示大约8个部分的tableview,每个部分都支持我自己的PlaceList类,表示对象列表(实现使用NSMutableArray)。总共有大约200个对象。每个部分对应于物体离当前位置有多远(例如1英里内,10,25,50 ......等)。

每隔一段时间,我需要响应来自CoreLocation的异步通知,这些通知要求我重新计算每个对象所属的部分,更新每个对象的距离(显示在每个单元格中),并且还要求每个列表,然后重新加载表视图。我也在viewWillAppear中执行此操作。

在执行更新的操作(PlaceList上的方法)中,我使用了@synchronized(self),以防操作系统从多个线程调用它(我自己不使用另一个线程)当下)。但是,目前这个操作会导致UI不时地“冻结”,所以我正在寻找在自己的线程中执行此操作的方法。

问题

  • 对支持表格视图的数据执行此类长时间运行操作的最佳方法是什么?据我所知,剥离后台线程来执行操作是不安全的,因为即使我在完成时使用performSelector重新加载主线程上的表视图,用户仍然可能会点击一个单元格操作正在运行且数据与显示不一致。并且添加任何类型的锁定都会破坏目的。

  • UI和CoreLocation locationManager是否在同一个线程上发送通知,即我可以安全地免除PlaceList上的@synchronized(self)吗?

1 个答案:

答案 0 :(得分:3)

这是我对你的问题的理解。您有大量数据,在某些时候它将变为无效。为了使其再次有效,您必须先进行一些处理才能重新绘制表格。

如果这是正确的,这里有几个选项。

1)双倍缓冲数据。只要您显示“是”正确的内容,用户就可以很好地与它进行交互。当您获得重新处理数据的触发器时,请在后台使用副本处理它,并且当它准备好完全重绘时,请更新。该更新可能是突然的和大的,但显示的数据将始终是正确的,或至少是理智的,并且UI继续运行并且不会吓到用户。

这很大程度上避免了线程问题,因为通知不会修改数据并尝试同时显示数据。

AFAIK,Facebook应用程序似乎也是这样做的,以及TwitterFon。至少那是它的感觉。很难说肯定。

2)加载画面!不好玩,但它有效。当你知道数据不好时,抛出一个半透明的面板并告诉用户稍微停下来。

现在或稍后更新真的归结为现在。您必须决定在您的应用程序中最有意义的权衡。