iOS套接字inputstream阻止UI,但未在主线程上调度

iOS套接字inputstream阻止UI,但未在主线程上调度,ios,swift,inputstream,grand-central-dispatch,Ios,Swift,Inputstream,Grand Central Dispatch,当我的应用程序通过网络输入流接收数据时,会在主线程上调用相应的streamDelegate。当接收到大量数据时,UI会阻塞数据。 我试图从一个 DispatchQueue.global(qos: .whatever).sync() 但尽管 inputStream.schedule(in: .current,forMode: .commonModes) 在该队列中调用,streamDelegate仍在Main上调用 从我阅读和理解到现在为止,.sync对我没有任何帮助,因为它仍然会阻塞UI,因

当我的应用程序通过网络输入流接收数据时,会在主线程上调用相应的streamDelegate。当接收到大量数据时,UI会阻塞数据。 我试图从一个

DispatchQueue.global(qos: .whatever).sync()
但尽管

inputStream.schedule(in: .current,forMode: .commonModes)
在该队列中调用,streamDelegate仍在Main上调用

从我阅读和理解到现在为止,.sync对我没有任何帮助,因为它仍然会阻塞UI,因为它会等待完成,然后再将控件返回UI。因此,我对.async进行了同样的尝试。当所有流在异步线程上工作时,outputStream工作正常,但inputStreams的streamDelegate不会启动。我没有收到回复

我做错了什么

class AppDelegate {
  let mSocketClass = SocketClass()
  func application(_:){
    DispatchQueue.global(qos: .utility).async(){
      mSocketClass.setupNetworkCommunication()
      mSocketClass.sendStuff()
    }
  } 
}

顺便说一句:我不喜欢使用框架的解决方案。在我看来,解决办法是改变一行我只是不明白


谢谢

代码几乎没有问题,但您需要在该线程上启动一个运行循环

所以它应该看起来像:

DispatchQueue.global(qos: .utility).async(){
    self.mSocketClass.setupNetworkCommunication()
    RunLoop.current.run()
}
请注意:

RunLoop.current.run永远不会返回。应该是设置中的最后一行。 然后在后台线程上接收数据。如果要在接收数据后更新用户界面,则必须使用DispatchQueue.main.async{/*UI update*/}
让我知道它对您的作用。

我在下面的答案中找到了一些相关的东西。谢谢你的帮助,但遗憾的是这不起作用。哇!多有启发性的回答啊。突然间,一切都变得如此顺利;。遗憾的是,尽管OutputStream.write成功,但有时inputStream委托仍然没有启动。在这些情况下,run会立即返回。但我只在inputStream.status为.open时调用run,否则我会重试逻辑。那么在什么情况下,在流的上下文中会运行return呢?无论如何,非常感谢!!!没关系,找到了原因。重试逻辑使用了更多队列,可能在另一个队列上调用了run,然后调用了inputstream.schedule。
DispatchQueue.global(qos: .utility).async(){
    self.mSocketClass.setupNetworkCommunication()
    RunLoop.current.run()
}