一些挖后,我发现来实现对雨燕侧流编程(使用本地斯威夫特的能力)的方式。事实证明,Swift中的方式非常类似于Objective C中的方式。
在Swift中启用流编程所需的两个函数是func connect()
,我必须自己编写这两个函数,而func stream(_ aStream: Stream, handle eventCode: Stream.Event)
一种方法在StreamDelegate
。
这里是func connect()
样子:
func connect() {
Stream.getStreamsToHost(withName: <serverIP>, port: <serverPort>, inputStream: &inputStream, outputStream: &)
guard let inputStream = inputStream, let outputStream = outputStream else {
print(" ->\tNetworkControllerError: Cannot open inputstream/outputstream.")
return
}
// Set delegate
inputStream.delegate = self
outputStream.delegate = self
let socketWorkQueue = DispatchQueue(label: "socketWorkQueue", attributes: .concurrent)
CFReadStreamSetDispatchQueue(inputStream, socketWorkQueue)
CFWriteStreamSetDispatchQueue(outputStream, socketWorkQueue)
inputStream.open()
outputStream.open()
}
这里是什么func stream(_ aStream: Stream, handle eventCode: Stream.Event)
样子:
func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
if aStream === inputStream {
switch eventCode {
case Stream.Event.errorOccurred:
streamEventQueue.async {
// do something here
}
break
case Stream.Event.openCompleted:
streamEventQueue.async {
// do something here
}
break
case Stream.Event.hasBytesAvailable:
streamEventQueue.async {
// do something here
let output = read()
}
break
case Stream.Event.endEncountered:
streamEventQueue.async {
// do something here
}
break
default:
break
}
}
else if aStream === outputStream {
switch eventCode {
case Stream.Event.errorOccurred:
streamEventQueue.async {
// do something here
}
break
case Stream.Event.openCompleted:
streamEventQueue.async {
// do something here
}
break
default:
break
}
}
}
所以stream()
功能应该是在我的应用程序来进行状态转换的唯一的地方由网络连接/断开引起。请注意,我还使用串行事件队列来处理流事件。这是为了防止可能导致国家腐败的任何潜在的竞争条件。
对于那些对流编程不太熟悉的人来说,这是一个服务器 - 客户端通信模式,它保持连接/套接字活着。连接需要保持活跃,主要是由于服务器和客户端之间存在持续通信。像RESTful API这样的通信模式会严重影响服务器的客户请求,因此不推荐使用。
您是否计划每次都建立一个新的连接或保持连接?您是否从NSURLSession中探索了内置的API,以查看它们是否满足您的需求? – jtbandes
@jtbandes感谢您的及时回复。我需要为应用程序保留一个持续的TCP连接。我也研究过NSURLSession,但是看起来这个API更适合HTTP RESTful支持(我非常乐意被纠正)。对我而言,不断地向服务器发起新的REST调用会给服务器带来巨大的负担。 – cafemike