什么';更新当前显示的iphone tableview中的数据的长时间运行操作的最佳实践是什么?

什么';更新当前显示的iphone tableview中的数据的长时间运行操作的最佳实践是什么?,iphone,cocoa-touch,multithreading,uitableview,core-location,Iphone,Cocoa Touch,Multithreading,Uitableview,Core Location,背景: 我有一个tableview,其中显示了大约8个部分,每个部分都有我自己的PlaceList类作为后盾,该类表示一个对象列表(实现使用了NSMutableArray)。总共大约有200个对象。每个部分对应于对象距离当前位置的距离(例如,1英里内、10、25、50…等) 有时,我需要响应CoreLocation发出的异步通知,这些通知要求我重新计算每个对象所属的部分,更新每个对象的距离(显示在每个单元格中),并使用每个列表,然后重新加载表视图。我也会在ViewWillDisplay中执行此操

背景

我有一个tableview,其中显示了大约8个部分,每个部分都有我自己的PlaceList类作为后盾,该类表示一个对象列表(实现使用了NSMutableArray)。总共大约有200个对象。每个部分对应于对象距离当前位置的距离(例如,1英里内、10、25、50…等)

有时,我需要响应CoreLocation发出的异步通知,这些通知要求我重新计算每个对象所属的部分,更新每个对象的距离(显示在每个单元格中),并使用每个列表,然后重新加载表视图。我也会在ViewWillDisplay中执行此操作

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

问题

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

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


    • 以下是我对您问题的理解。您有一个很大的数据列表,在某个时候它将变得无效。为了使其再次有效,必须先进行一些处理,然后才能重新绘制该表

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

      1) 双重缓冲你的数据。只要您显示的内容“是”正确的,用户就可以很好地与之交互。当您触发重新处理数据时,请在后台使用副本对其进行处理,当它准备完全重新绘制时,请进行更新。这种更新可能是突然的,而且规模很大,但是显示的数据总是正确的,或者至少是正常的,并且用户界面继续运行,不会吓到用户

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

      顺便说一句,Facebook应用程序和TwitterFon似乎都能做到这一点。至少感觉是这样的。很难说清楚

      2) 加载屏幕!虽然不好玩,但很管用。当你知道数据不好时,抛出一个半透明的面板,告诉用户稍等一下


      它实际上可以归结为现在更新,或者以后更新。您必须决定在应用程序中什么样的权衡最有意义。

      已经尝试了加载屏幕选项,但我认为我会尝试选项1,可能会使用NSOperationQueue在工作线程上启动更新。缺点是,更新可能会时不时地非常大(即,部分之间的内容移动),这可能会让用户感到奇怪。我想知道tableview是否可以制作动画。