【问题标题】:How can I keep an output stream open in Objective-C?如何在 Objective-C 中保持输出流打开?
【发布时间】:2012-07-13 22:18:21
【问题描述】:

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

- (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在输出流中没有其他内容可写入时被调用,因此输出流被丢弃。我怎样才能保持这个流打开写作?根据Apple's documentation,此事件被正确调用,因为没有任何内容写入输出流。有什么想法吗?

【问题讨论】:

    标签: objective-c ios cocoa stream


    【解决方案1】:

    您是否将流放入运行循环中? 请参阅此处的示例:http://www.raywenderlich.com/3932/how-to-create-a-socket-based-iphone-app-and-server

    【讨论】:

    • Workshed 的示例很棒,我目前正在关注一个示例,但是其中存在一个错误,即 NSStreamEventEndEncountered 从未在 case 语句中被捕获。但是,如果您将 NSStreamEventEndEncountered 替换为其 typedef 4,它会被捕获并且示例停止工作。尽管来自 Ceasar 的这个示例很棒,但在 handleEvent 方法中似乎有两个错误允许它工作。修复其中任何一个都会破坏样本。
    【解决方案2】:

    文档在这一点上并不清楚,但一个合理的解释是当你写到它的容量时,流将发送NSStreamEventEndEncountered。 (不清楚的部分是这是否适用于所有流或仅适用于 where you specify a capacity。例如,当文件所在的卷已满时,基于文件的流可以发送 NSStreamEventEndEncountered。)

    鉴于“容量”的定义是您不能写入更多内容,因此在该点之后保持流打开是没有意义的。即使您有更多字节要写入,流也没有地方放置它们。

    【讨论】:

      猜你喜欢
      • 2019-04-14
      • 1970-01-01
      • 2021-04-23
      • 2010-11-03
      • 1970-01-01
      • 2015-09-21
      • 2018-12-24
      • 2018-01-23
      • 2016-03-04
      相关资源
      最近更新 更多