我正在用iOS和OutputStream编写一个应用程序。但是,我发现我可以从流中读取和写入,而无需在RunLoop中调度它们!
我在这里是我的ThreadFunc。注意,我已经注释掉了所有的runLoop代码,但是它仍然有效!
@objc func threadFunc(){
var dataToSend: Data?;
print("Inside threadFunc loop!");
//self.m_ReadStream?.schedule(in: RunLoop.current, forMode: RunLoopMode.commonModes );
self.m_ReadStream!.open();
//self.m_WriteStream?.schedule(in: RunLoop.current, forMode: RunLoopMode.commonModes );
self.m_WriteStream!.open()
var once = false;
while( !m_Calcelled ){
let wStat = self.m_WriteStream?.streamStatus;
let rStat = self.m_ReadStream?.streamStatus;
if( dataToSend == nil && self.m_Lock.lock(before: Date(timeIntervalSinceNow: 10 ) )){
dataToSend = self.m_DataToSend; // Make local copy
self.m_DataToSend = nil;
self.m_Lock.unlock();
}
if( dataToSend != nil && wStat == .open ){
let totalBytesSent = self.sendDataBlock( d:dataToSend! );
if( totalBytesSent == dataToSend?.count ){
print("successfully sent the packet.");
}
}
//let untilDate: Date = Date(timeIntervalSinceNow: 5 );
//print("SocketThread. Calling runLoop...");
//RunLoop.current.run( mode: .defaultRunLoopMode, before: untilDate );
//print("SocketThread is waiting for action....");
//sleep(1); // Sleep for 1 second...
}
}发布于 2018-10-03 20:19:00
正如医生们所指出的:
除非客户端轮询流,否则它负责确保在至少一个运行循环上调度该流,并确保正在运行该流所调度的至少一个运行循环。
你在轮询溪流。通常情况下,流的使用方式并不是这样,但是由于您使用了流,所以它不需要运行循环。
https://stackoverflow.com/questions/52634122
复制相似问题