gpt4 book ai didi

IOS UI 在套接字连接期间卡住

转载 作者:行者123 更新时间:2023-11-29 00:06:24 24 4
gpt4 key购买 nike

我对流或套接字连接了解不多,但似乎没有其他方法可以满足我的需要。我正在尝试构建一个简单的连接,该连接将允许我监视打开的连接并在收到输入时读取该输入。

连接工作正常,但用户界面在连接设置期间卡住。我不知道如何将其推到后台,这样它就不会干扰用户界面。

套接字类别如下

import Foundation

protocol SocketDelegate {
func hasBytes(stream: Stream)
func opened(stream: Stream)
func error(stream: Stream)
func closed(stream: Stream)
func other(stream: Stream)
}

class Socket: NSObject, StreamDelegate {

fileprivate var hostname: String
fileprivate var port: Int

fileprivate var delegate: SocketDelegate?

fileprivate var istreamopen: Bool
fileprivate var ostreamopen: Bool

fileprivate var istream : InputStream?
fileprivate var ostream : OutputStream?

init(hostname: String, port: Int) {

self.hostname = hostname
self.port = port
self.istreamopen = false
self.ostreamopen = false

Stream.getStreamsToHost(withName: self.hostname, port: self.port, inputStream: &self.istream, outputStream: &self.ostream)


self.istream!.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)
self.ostream!.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)

}


func getInputStream() -> InputStream {
return istream!
}

func getOutputStream() -> OutputStream {
return ostream!
}

func Connect() -> Void {

self.istream?.delegate = self
self.ostream?.delegate = self

istream!.open()
ostream!.open()
}

func DisConnect() -> Void {
istream!.close()
ostream!.close()
istreamopen = false
ostreamopen = false
}

func write(bytes: [UInt8]) {
ostream?.write(bytes, maxLength: (bytes).count)
}

func write(string: String) {
ostream?.write([UInt8](string.utf8), maxLength: ([UInt8](string.utf8)).count)
}

func read(bufferSize: Int) -> String {
var output = String()
var buffer = [UInt8](repeating: 0, count: bufferSize)
//while (self.istream?.hasBytesAvailable)! {
//print("HELLO")
let bytesRead: Int = self.istream!.read(&buffer, maxLength: buffer.count)
if bytesRead >= 0 {
output += NSString(bytes: UnsafePointer(buffer), length: bytesRead, encoding: String.Encoding.ascii.rawValue)! as String
} else {
output = "# Stream read() error"
}
//print(output)
//}
return output
}


func setDelegate(delegate: SocketDelegate) -> Void {
self.delegate = delegate
}

func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
//print("\(aStream) Stream!")
switch eventCode {
case Stream.Event.hasBytesAvailable:
delegate?.hasBytes(stream: aStream)
break;
case Stream.Event.errorOccurred:
//print("Stream error occurred: %@",aStream.streamError?.localizedDescription ?? "ERROR")
delegate?.error(stream: aStream)
case Stream.Event.openCompleted:
//print("\(aStream) -- \(self.istream) -- \(self.ostream)")
if (aStream == self.istream) {
self.istreamopen = true
//print("\(self.istream) Open")
} else if (aStream === self.ostream) {
self.ostreamopen = true
//print("\(self.ostream) Open")
}
delegate?.opened(stream: aStream)
break
case Stream.Event.endEncountered:
//print("Stream ended")
if (aStream === self.istream) {
self.istreamopen = false
} else if (aStream === self.ostream) {
self.ostreamopen = false
}
delegate?.closed(stream: aStream)
break
default:
delegate?.other(stream: aStream)
break
}
}

func isConnected() -> Bool {
return (istreamopen && ostreamopen)
}


}

最佳答案

看来不是连接失败了。这是 SSL 协商期间的初始写入。我将写入命令包装在 DispatchQueue 中,它似乎已经解决了这个问题。

  func write(bytes: [UInt8]) {
DispatchQueue.global(qos: .background).async {
self.ostream?.write(bytes, maxLength: (bytes).count)
}
}

func write(string: String) {
DispatchQueue.global(qos: .background).async {
self.ostream?.write([UInt8](string.utf8), maxLength: ([UInt8](string.utf8)).count)
}
}

关于IOS UI 在套接字连接期间卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47948055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com