如何在Objective-C中保持输出流打开?

时间:2012-07-14 04:33:41

标签: objective-c ios cocoa stream

我正在将数据写入事件内的流:

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode

如下(取自Apple的文档):

case NSStreamEventHasSpaceAvailable:
    uint8_t *readBytes = (uint8_t *)[self.outData mutableBytes];            
    readBytes += byteIndex;            
    int dataLength = [self.outData length];            
    unsigned int length = ((dataLength - byteIndex >= 1024) ? 1024 : (dataLength - byteIndex));            
    uint8_t buffer[length];            
    (void)memcpy(buffer, readBytes, length);            
    length = [self.outputStream write:(const uint8_t *)buffer maxLength:length];            
    byteIndex += length;            
    break;

但是,当在输出流中没有其他内容写入时,将调用事件NSStreamEventEndEncountered,因此将丢弃输出流。我如何保持这个流开放写作?根据{{​​3}},正确调用此事件,因为没有任何内容写入输出流。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

你有没有把你的流放入runloop? 请参阅此处的示例:http://www.raywenderlich.com/3932/how-to-create-a-socket-based-iphone-app-and-server

答案 1 :(得分:0)

关于这一点,文档并不清楚,但合理的解释是当您写完容量时,流将发送NSStreamEventEndEncountered。 (不清楚的部分是所有流是否都是如此,或者只有那些where you specify a capacity。例如,基于文件的流可以在文件所在的卷已满时发送NSStreamEventEndEncountered。)< / p>

鉴于“容量”的定义是你不能写得那么多,保持流程在这一点上打开是没有意义的。即使你有更多的字节要写,流也没有地方可以放置它们。