所以,看看你
NSStreamDelegate
,看起来您还没有实现switch语句的所有情况。我最近为OSX编写了一个IRC客户端,它使用
NSStream
和
NSStream委派
以非常相似的方式,我非常确信,当你没有检查所有的情况时,编译器应该会抱怨。
回顾
some of my code
看起来你应该检查一下这些箱子
-
NSStreamEventHasSpaceAvailable
-
NSStreamEventOpenCompleted
-
NSStreamEventHasBytesAvailable
-
NSStreamEventEndEncountered
-
NSStreamEventErrorOccurred
所以你没有检查的情况是
NSStream事件具有可用空间
,此时您可以开始向流中写入内容。
编辑:再次阅读您的代码,我在您的
sendMessage
您正在使用的操作
outputStream
对象,而不是委托编写,然后自己完成从
inputStream
。我认为您可能希望使用委托,而不要直接从输入流中读取,因为这将极大地简化代码从网络接收数据的方式。据我所知,
NSStream(NS流)
有没有围绕数据是从网络缓冲的这一事实提供一个小的抽象层,这样你就不需要做调用之类的事情
usleep
而您的输入流没有可供读取的字节。
编辑2:我读到了你关于你的代码永远不会过时的更新
while (![inputStream hasBytesAvailable])
很明显,问题在于您没有正确使用流。在我看来,最好的使用方式
NSStream(NS流)
是使用其
handleEvent:(NSStreamEvent) event
方法,并且永远不要直接告诉它写入字节,或者在有可用字节之前休眠。
在我链接到您的代码中,我有一个readDelegate和一个writeDelegate,它们都处理
NSStreams
,您可能想看看我是如何使用writeDelegate的
here
。我基本上有一个方法,
addCommand:(NSString *) command
将要写入流的字符串放入队列,然后当我的流委托可以写入字节时(
NSStream事件具有可用空间
),我写尽可能多的字节。我希望这能有所帮助!