NSOperationQueues中的信号量

时间:2016-05-05 02:07:59

标签: ios cocoa grand-central-dispatch semaphore nsoperationqueue

我是在Swift / NSOperationQueue设计的第一次摇摆,我试图弄清楚如何在队列中维护数据完整性。

我在设计过程的早期阶段,但该架构可能涉及一个队列(称为sensorQ),处理来自各种传感器的传感器测量流,这些传感器将为融合模型提供信息。传感器数据将以各种速率进入,有些速度非常快(例如加速计数据),但有些需要延长计算,可能需要一秒或更长时间。

我想弄清楚的是如何将当前状态捕获到UI中。 UI必须由主队列处理(称为mainQ),但会反映融合引擎的当前状态。

我不想用传感器队列上发生的每次更新来敲击UI线程,因为它们可能经常发生,因此NSOperationQueue.mainQueue.addOperationWithBlock()调用将状态传递回UI并不会。似乎可行。出于同样的原因,我不想向传感器队列发送查询,因为如果它处理了长时间的计算,我会阻止等待它。

我正在考虑设置一个可能每隔十分之一秒左右将状态复制到用户界面的NSTimer。

为此,我需要确保在将传真队列复制到UI队列的同时,状态不会在传感器队列上更新。似乎是信号量的工作,但我并没有提到与NSOperationQueues相关的信号量。

我在Grand Central Dispatch中找到dispatch_semaphore_t个对象的引用。

所以我的问题基本上是,处理这些情况的推荐方法是什么?我看到在最高抽象级别(NSOperationQueue)工作的反复告诫,除非您需要优化较低级别(如GCD)。这是一个我需要优化的情况吗? dispatch_semiphore_t可以与NSOperationQueue一起使用吗?这里有基于NSOperationQueue的方法,我可以忽略吗?

2 个答案:

答案 0 :(得分:0)

您要向UI发送多少数据?几个数字?一个复杂的图表?

如果您正在处理NSOperationQueue上的所有传感器数据(让我们称之为sensorQ),为什么不将队列串行?然后,当您的计时器触发时,您可以向sensorQ发布“更新UI”任务。当您的更新任务到达sensorQ时,您知道没有其他传感器正在修改状态。您可以捆绑数据并发布到主(UI)队列。

如果我们知道,可以提供更好的答案:    1.您的传感器是否具有最小和最大数据速率?    2.您的融合模型有多少传感器?    3.如何同步从传感器到融合模型的访问?    4. UI的“更新”有多少数据和格式?

我的预感是,信号量不是必需的。

答案 1 :(得分:0)

这里可能有用的一种方法是通过环形缓冲区将传感器数据队列与UI活动分离。这有效地消除了对信号量的需求。

想法是传感器数据处理组件将数据推入环形缓冲区,UI组件从环形缓冲区中提取数据。传感器数据线程以传感器/处理器确定的速率写入,UI线程以适合您应用的刷新速率读取。