背景:
我有一个显示大约8个部分的tableview,每个部分都支持我自己的PlaceList类,表示对象列表(实现使用NSMutableArray)。总共有大约200个对象。每个部分对应于物体离当前位置有多远(例如1英里内,10,25,50 ......等)。
每隔一段时间,我需要响应来自CoreLocation的异步通知,这些通知要求我重新计算每个对象所属的部分,更新每个对象的距离(显示在每个单元格中),并且还要求每个列表,然后重新加载表视图。我也在viewWillAppear中执行此操作。
在执行更新的操作(PlaceList上的方法)中,我使用了@synchronized(self),以防操作系统从多个线程调用它(我自己不使用另一个线程)当下)。但是,目前这个操作会导致UI不时地“冻结”,所以我正在寻找在自己的线程中执行此操作的方法。
问题:
对支持表格视图的数据执行此类长时间运行操作的最佳方法是什么?据我所知,剥离后台线程来执行操作是不安全的,因为即使我在完成时使用performSelector重新加载主线程上的表视图,用户仍然可能会点击一个单元格操作正在运行且数据与显示不一致。并且添加任何类型的锁定都会破坏目的。
UI和CoreLocation locationManager是否在同一个线程上发送通知,即我可以安全地免除PlaceList上的@synchronized(self)吗?
答案 0 :(得分:3)
这是我对你的问题的理解。您有大量数据,在某些时候它将变为无效。为了使其再次有效,您必须先进行一些处理才能重新绘制表格。
如果这是正确的,这里有几个选项。
1)双倍缓冲数据。只要您显示“是”正确的内容,用户就可以很好地与它进行交互。当您获得重新处理数据的触发器时,请在后台使用副本处理它,并且当它准备好完全重绘时,请更新。该更新可能是突然的和大的,但显示的数据将始终是正确的,或至少是理智的,并且UI继续运行并且不会吓到用户。
这很大程度上避免了线程问题,因为通知不会修改数据并尝试同时显示数据。
AFAIK,Facebook应用程序似乎也是这样做的,以及TwitterFon。至少那是它的感觉。很难说肯定。
2)加载画面!不好玩,但它有效。当你知道数据不好时,抛出一个半透明的面板并告诉用户稍微停下来。
现在或稍后更新真的归结为现在。您必须决定在您的应用程序中最有意义的权衡。