2016-05-05 194 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

设置不会违反MVC体系结构的依赖关系的最佳方式是什么?传感器数据直接传送给为模型提供信息的sensorQ。 UI不应该从模型中提取数据,而不是让模型知道视图控制器?也许通知是要走的路? (我还在看那个视频 - 感谢指针)。 – Omegaman

回答

0

您发送给用户界面的数据量是多少?几个数字?一个复杂的图形?

如果您正在处理NSOperationQueue上的所有传感器数据(我们称其为sensorQ),为什么不使队列连续?然后,当您的计时器触发时,您可以发送一个“更新UI”任务给sensorQ。当更新任务到达sensorQ时,您知道没有其他传感器正在修改状态。您可以打包数据并发布到主(UI)队列中。如果我们知道: 1.您的传感器是否具有最小和最大数据速率? 2.有多少传感器对您的融合模型有贡献? 3.你如何同步从传感器到融合模型的访问? 4.有多少数据以及什么格式是UI的“更新”?

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

+0

避免信号量与NSOperationQueues的首选习惯用法?传感器补码还没有完全确定,但上面提到的极限值应该是100-200Hz的加速度计数据,而图像数据可能需要一秒钟才能处理。后者反对将UI请求放入sensorQ中。 sensorQ将是串行的,确保传感器更新是FIFO。到用户界面的数据将是一组生产中的数字,但对于诊断可能还要多一点(不太重要)。图形化可以通过在UI控制器中保留时间序列来完成。 – Omegaman

0

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

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