首页 > 解决方案 > 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...
    }
}

标签: iosmultithreadingrunloop

解决方案


正如文档所指出的:

除非客户端正在轮询流,否则它负责确保流被安排在至少一个运行循环上,并且至少有一个运行循环在其上被调度流正在运行。

您正在轮询流。这通常不是流的使用方式,但既然你是,它不需要运行循环。


推荐阅读