2016-05-05 255 views
1

我在Swift/NSOperationQueue基础设计中第一次使用Swing,并且试图找出如何保持队列之间的数据完整性。NSOperationQueues中的信号量

我在设计过程中很早,但架构可能会涉及一个队列(称为sensorQ),处理来自各种传感器的传感器测量流,这些传感器将馈送融合模型。传感器数据将以各种速率出现,一些速度相当快(例如,加速度计数据),但有些则需要扩展计算,可能需要一秒或更多时间。

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

我不想在传感器队列上发生的每次更新都敲击UI线程,因为它们可能会频繁发生,所以NSOperationQueue.mainQueue.addOperationWithBlock()调用传递状态返回UI似乎不可行。同样的道理,我不想发送查询到传感器队列,因为如果它正在处理一个长时间的计算,我会阻止等待它。

我正在考虑设置一个NSTimer,可以每十分之一秒左右将状态复制到UI中。

为此,我需要确保传感器队列上的状态没有被更新,同时我将它拷贝到UI队列中。看起来像是一个信号量的工作,但我并没有提到与NSOperationQueues有关的信号量。

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

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

+0

你可能想看https://developer.apple.com/videos/play/wwdc2015/226/的想法,也有一些基于这个谈话的库。 –

+0

这里你可能不需要信号量。您可以尝试将UI刷新操作添加为长时间运行的依赖项,AFAIK依赖项可以是交叉队列,也可以作为依赖项。每10次快速刷新一次。同时尽量避免定时器,它们可能会对电池寿命产生非常负面的影响。 –

+0

设置不会