代码之家  ›  专栏  ›  技术社区  ›  frankodwyer

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

  •  1
  • frankodwyer  · 技术社区  · 15 年前

    出身背景 :

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

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

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

    问题

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

    1 回复  |  直到 15 年前
        1
  •  3
  •   Nick Veys    15 年前

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

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

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

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

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

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