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

Asynchronous NSTextView在异步添加大量数据时冻结我的应用程序,asynchronous,swift3,nstextview,osc,Asynchronous,Swift3,Nstextview,Osc,我正在构建一个简单的talker/listener应用程序,通过UDP接收OSC数据。我使用的是OSCKit pod,它本身使用CocoaAsyncSocket库进行内部UDP通信。 
 当我监听某个特定端口以从另一个支持OSC的软件接收数据时,我会将接收到的命令记录到NSTextView。问题是,有时我会在很短的时间内收到数千条消息(编辑:我只是添加了一个计数器来查看我收到了多少条消息。我在几秒钟内收到了14000多条消息,而这只是我软件中的一个移动对象)。无法预测何时会发生这种情况,因此我无

我正在构建一个简单的talker/listener应用程序,通过UDP接收OSC数据。我使用的是OSCKit pod,它本身使用CocoaAsyncSocket库进行内部UDP通信。 
 当我监听某个特定端口以从另一个支持OSC的软件接收数据时,我会将接收到的命令记录到
NSTextView
。问题是,有时我会在很短的时间内收到数千条消息(编辑:我只是添加了一个计数器来查看我收到了多少条消息。我在几秒钟内收到了14000多条消息,而这只是我软件中的一个移动对象)。无法预测何时会发生这种情况,因此我无法锁定
NSTextView
textStorage
对象,以防止它发送所有通知来更新UI。数据通过委托回调函数进行处理。

 那么,你将如何绕过这一限制

   ///Handle incoming OSC messages
   func handle(_ message: OSCMessage!) {

      print("OSC Message: \(message)")

      let targetPath = message.address
      let args = message.arguments

      let msgAsString = "Path: \"\(targetPath)\"\nArguments: \n\(args)\n\n"
      print(msgAsString)
      oscLogView.string?.append(msgAsString)
      oscLogView.scrollToEndOfDocument(self)
   }
正如您在这里看到的(这是回调函数),每次收到消息时,我都直接从回调更新TextView(添加数据和滚动到末尾)。这是仪器告诉我减速发生的地方,附加是最慢的。我在分析中没有进一步说明,但这肯定是因为它尝试进行可视化更新,这比解析32位数据要花费更多的时间,并且在完成后,它会立即从服务器的缓冲区接收另一个更新

我可以把电话发送到后台线程吗?我觉得用视觉更新填充背景线程不是一个好主意。也许我可以自己增加字符串缓冲区,并时不时地用定时器将其刷新到TextView

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


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

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


如果有人能想出一个更优雅的方法,我是开明的。

你好,獾。请编辑您的问题以添加更多信息,而不是发布回答,这会使理解更加清楚。谢谢。我想那很好,因为这是我找到的解决办法;)。今晚我会更新这个问题。哇,很抱歉。最后一行让我困惑,但没关系,你是对的。请使用问题的编辑链接添加其他信息。回答后按钮只能用于完整回答问题。-@Arpit:如果你正确阅读,它是一个解决方案。留待提出建议并不意味着这是一个问题。我还没有将问题标记为已回答,以防我得到其他解决方案。由于您有14000个结果,并且在单个滚动界面中可能无法接受,您难道不想跳过0.01s左右的消息吗?所以你会每0.01秒阻止一次更新,然后等待下一条消息,这将导致每秒最多100条消息,我想这将足够快,可以看到并且不会减慢速度。没有消息可以跳过。我只是在填充一个缓冲区,然后用一个计时器将它添加到textView中。很好。