ios - InputStream ios 在没有 RunLoop 的情况下工作
问题描述
我正在使用 InputStream 和 OutputStream 编写一个 iOS 应用程序。但是,我发现我可以从流中读取和写入,而无需将它们安排在 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...
}
}
解决方案
正如文档所指出的:
除非客户端正在轮询流,否则它负责确保流被安排在至少一个运行循环上,并且至少有一个运行循环在其上被调度流正在运行。
您正在轮询流。这通常不是流的使用方式,但既然你是,它不需要运行循环。
推荐阅读
- python - 如何将所有 Scrapy HTML 文件保存到 S3?
- html - HTML / CSS:如何将指向另一个网站的链接对齐到网页中心 --> 尝试在 CSS 中将链接对齐到中心...不起作用
- scikit-learn - Jupyter笔记本内核在终端日志“无法打开静态文件”时一直死机
- batch-file - 批量获取进程 ID 时出错
- ruby - 我正在努力实现预期的输出,但未能为以下问题陈述创建可重用的代码。有什么建议么?
- xcode - Xcode 文件从 Mac 中消失
- python - 当我选择子菜单时,我试图隐藏我的主菜单屏幕小部件
- r - 尝试移动列中的条目
- c# - SAML SSO - 它如何与多个服务提供商合作
- python - pd.concat(array).groupby('date').sum() 返回意外行为