我正在构建一个通过UDP接收OSC数据的简单的说话者/监听器应用程序。我正在使用OSCKit pod,它本身使用CocoaAsyncSocket库进行内部UDP通信。
当我正在侦听特定端口以从另一个支持OSC的软件接收数据时,我将收到的命令记录到NSTextView
。问题是,有时候,我会在很短的时间内收到数千封邮件(编辑:我刚添加了一个计数器,看看我收到了多少邮件。我在几秒钟内收到了超过14000封邮件这只是我软件中的一个移动对象)。没有办法预测何时会发生这种情况,因此我无法锁定textStorage
的{{1}}对象,以防止它发送所有通知以更新UI。数据通过委托回调函数处理
那么你将如何解决这个限制?
NSTextView
正如你在这里看到的(这是回调函数)我每次收到一条消息时都会直接从回调(包括添加数据和滚动到最后)更新TextView。这是仪器告诉我减速发生的地方,追加是最慢的。我没有比分析更进一步,但它肯定是因为它试图进行视觉更新,这比解析32位数据需要花费更多的时间,以及何时进行。完成后,它会立即从服务器的缓冲区接收另一个更新。
我可以将该调用发送到后台线程吗?我不想用视觉更新来填充后台主题是个好主意。也许正在增长我自己的字符串缓冲区并且每次都用计时器将它刷新到TextView?
我想给它一个控制台的感觉,但冻结的控制台不是控制台。
以下是project on github的链接。 pod都在那里并配置了cocoapods,所以只需打开工作区。你们可能没有任何东西可以产生那么多的OSC流量,但是如果你真的想要深入研究,你可以得到IanniX,这是一个开源的音序器/轨迹自动机,可以生成OSC和很多。我刚刚下载了它,我将构建一个快速项目,该项目应该发送足够的数据来冻结应用程序,如果有人想试一试,我会将它添加到回购邮件中。
答案 0 :(得分:0)
我将传入的数据附加到缓冲区变量,我使用一个计时器,每隔0.2秒将该缓冲区刷新到textview。 textview的更新周期太慢,无法处理传入数据的数量,因此将网络回调解锁到计时器让服务器处理数据而不是每32位停止一次。
如果有人提出更优雅的方法,我会心胸开阔。