NSTextView在异步添加大量数据时冻结我的应用

时间:2017-07-24 04:15:14

标签: asynchronous swift3 nstextview osc

我正在构建一个通过UDP接收OSC数据的简单的说话者/监听器应用程序。我正在使用OSCKit pod,它本身使用CocoaAsyncSocket库进行内部UDP通信。 当我正在侦听特定端口以从另一个支持OSC的软件接收数据时,我将收到的命令记录到NSTextView。问题是,有时候,我会在很短的时间内收到数千封邮件(编辑:我刚添加了一个计数器,看看我收到了多少邮件。我在几秒钟内收到了超过14000封邮件这只是我软件中的一个移动对象)。没有办法预测何时会发生这种情况,因此我无法锁定textStorage的{​​{1}}对象,以防止它发送所有通知以更新UI。数据通过委托回调函数处理 那么你将如何解决这个限制?

NSTextView

正如你在这里看到的(这是回调函数)我每次收到一条消息时都会直接从回调(包括添加数据和滚动到最后)更新TextView。这是仪器告诉我减速发生的地方,追加是最慢的。我没有比分析更进一步,但它肯定是因为它试图进行视觉更新,这比解析32位数据需要花费更多的时间,以及何时进行。完成后,它会立即从服务器的缓冲区接收另一个更新。

我可以将该调用发送到后台线程吗?我不想用视觉更新来填充后台主题是个好主意。也许正在增长我自己的字符串缓冲区并且每次都用计时器​​将它刷新到TextView?

我想给它一个控制台的感觉,但冻结的控制台不是控制台。

以下是project on github的链接。 pod都在那里并配置了cocoapods,所以只需打开工作区。你们可能没有任何东西可以产生那么多的OSC流量,但是如果你真的想要深入研究,你可以得到IanniX,这是一个开源的音序器/轨迹自动机,可以生成OSC和很多。我刚刚下载了它,我将构建一个快速项目,该项目应该发送足够的数据来冻结应用程序,如果有人想试一试,我会将它添加到回购邮件中。

1 个答案:

答案 0 :(得分:0)

我将传入的数据附加到缓冲区变量,我使用一个计时器,每隔0.2秒将该缓冲区刷新到textview。 textview的更新周期太慢,无法处理传入数据的数量,因此将网络回调解锁到计时器让服务器处理数据而不是每32位停止一次。

如果有人提出更优雅的方法,我会心胸开阔。