主线程上计划的打开但不活动的NSStream是否可以移至其他线程?

问题描述:

我正在使用(并且需要使用)我没有源代码的第三方框架。第三方框架处理创建经过身份验证的客户端/服务器连接并回传一对开放的NSStream。我面临的挑战是NSStreams被安排在主线程中(创建UI可能无响应的情况 - 这是我想避免的)。主线程上计划的打开但不活动的NSStream是否可以移至其他线程?

当流从第三方框架中被移交时,没有网络流量正在进行。所以,我想知道我是否可以不计划并重新安排NSStreams。

有谁知道是否有可能取消调度一个开放的NSStream并重新安排在另一个线程上的另一个运行循环?会导致问题吗?那里有代码示例吗?

在此先感谢!

亚伦

+0

它实际上是在线程中调度它还是阻塞?如果它只是阻塞,你可以在函数调用中使用NSInvocationOperation来阻止它。 – heckman

+0

@heckman我不确定我是否理解你的问题。我收到一个NSInputStream和一个NSOutputStream。当我收到NSStreamStatusOpen时,它们都处于状态。在我开始发送东西之前,没有任何流量在流上,所以它们有效地停滞。在主线程中,当代理消息被接收/服务时,他们将创建阻塞情况。 – xyzzycoder

+0

请参阅下面的回复。 – heckman

如果我正确理解您的应用程序,这意味着你的应用程序接收到特定流的引用,并且你负责对蒸阅读一切。读取这些流应该是你通过NSThread,NSOperation或其他线程机制从应用程序强制到后台的东西。

例子:

在任何文件你tieing在此NSInputStream:

@property (strong, nonatomic) NSInvocationOperation *parseOp; 

(id)startInputRead:(NSInputStream *)input { 
    if([input hasBytesAvailable]) { 
     self.parseOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(readAndStoreInput:) object:inputStream]; 

    } 

如果你的读者是这样的:

(void)readAndStoreInput:(NSInputSteam*) input{ 
    //process your input steam into your system in the background 

} 

这是多么你将一个简短的例子为输入端做这个。你也可以用类似的方式排队输出蒸汽。这应该使所有内容都能同时运行,并且您的应用可以保持响应。

+0

嗨。但是苹果的文档却说:“你永远不应该试图从一个不同于拥有该流运行循环的线程访问一个定时流。” https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Streams/Articles/ReadingInputStreams.html#//apple_ref/doc/uid/20002273-BCIJHAGD – xyzzycoder

+0

我认为这个回应中的代码会对于NSStream的读取位置是线程不可知的。苹果的文档似乎很清楚,这是一个禁忌。 – xyzzycoder

+0

@xyzzycoder你在执行scheduleInRun循环?没有理由说你无法将清单1中的所有代码放在后台子进程中 – heckman