我正在用户界面上显示来自数据模型的信息。我目前这样做的方法是通过以下方式进行委派:

@protocol DataModelDelegate <NSObject>
- (void)updateUIFromDataModel;
@end


我在控制器类中实现委托方法如下,使用GCD将UI更新推送到主线程:

- (void)updateUIFromDataModel {

    dispatch_async(dispatch_get_main_queue(), ^{

        // Code to update various UI controllers
        // ...
        // ...

    });
}


我担心的是,在某些情况下,可以非常频繁地调用此方法(每秒约1000次,每次更新多个UI对象),在我看来,这就像我在向主线程发送命令一样。

这太多了,无法发送到主线程吗?如果是这样,那么有人对实现此目标的最佳方式有什么想法吗?

我已经研究过dispatch_apply,但是在合并数据时这似乎更有用,这不是我想要的-我真的只是想跳过更新,如果它们太频繁了,那么只有相当数量的更新被发送到主线程!

我当时正在考虑采用另一种方法,而是采用计时器来连续轮询数据(例如每10毫秒一次),但是由于数据更新往往是零星的,所以我觉得这样做很浪费。

结合这两种方法,我考虑过的另一个选择是等待更新消息并通过设置计时器以设置的时间间隔轮询数据来响应,然后在数据似乎已停止更改时禁用计时器。但这是否会使问题变得过于复杂,合理的方法是简单地运行一个恒定的计时器吗?

编辑:在下面添加了一个答案,显示了使用调度源的改编

最佳答案

一种选择是使用类型为DISPATCH_SOURCE_TYPE_DATA_ORDispatch Source,它使您可以重复发布事件,并让libdispatch将它们组合在一起。当您有要发布的内容时,您可以使用dispatch_source_merge_data使其有新的操作要做。如果目标队列(在您的情况下是主队列)繁忙,则对dispatch_source_merge_data的多次调用将合并在一起。

10-08 14:40