小编Max*_*wer的帖子

iOS 套接字输入流阻塞 UI,但未安排在主线程上

当我的应用程序通过网络输入流接收数据时,会在主线程上调用相应的streamDelegate。当接收大量数据时,UI 阻塞非常明显。我试图从 a 中触发所有相应的功能

DispatchQueue.global(qos: .whatever).sync()
Run Code Online (Sandbox Code Playgroud)

但尽管

inputStream.schedule(in: .current,forMode: .commonModes)
Run Code Online (Sandbox Code Playgroud)

在该队列中被调用,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()
    }
  } 
}
Run Code Online (Sandbox Code Playgroud)

class SocketClass:NSObject {
  var mInputStream: InputStream!
  var mOutputStream: OutputStream!

  func setupNetworkCommunication(){
    var readStream: Unmanaged<CFReadStream>?
    var writeStream: Unmanaged<CFWriteStream>?
    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, "example.com" as CFString, 1234, &readStream, &writeStream)
    mInputStream = readStream!.takeRetainedValue()
    mOutputStream = writeStream!.takeRetainedValue()
    mInputStream.schedule(in: .current, forMode: .commonModes) //happens on thread other …
Run Code Online (Sandbox Code Playgroud)

inputstream grand-central-dispatch ios swift

2
推荐指数
1
解决办法
1505
查看次数

标签 统计

grand-central-dispatch ×1

inputstream ×1

ios ×1

swift ×1