0

イベント内のストリームにデータを書き込んでいます:

- (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 のドキュメントによると、出力ストリームには何も書き込まれないため、このイベントは正しく呼び出されます。何か案は?

4

2 に答える 2

1

ストリームをランループに入れましたか? ここで例を参照してください: http://www.raywenderlich.com/3932/how-to-create-a-socket-based-iphone-app-and-server

于 2012-07-14T11:36:55.607 に答える
0

ドキュメントはこの点について明確ではありませんが、合理的な解釈は、ストリームがNSStreamEventEndEncounteredその容量まで書き込んだときに送信されるということです。(不明な部分は、これがすべてのストリームに当てはまるのか、または容量を指定したストリームにのみ当てはまるのかです。たとえば、ファイルベースのストリームはNSStreamEventEndEncountered、ファイルが存在するボリュームがいっぱいになったときに送信できます。)

「容量」の定義が、それ以上書き込むことはできないということを考えると、そのポイントを超えてストリームを開いたままにしておくことは意味がありません。書き込むバイトがさらにある場合でも、ストリームにはそれらを配置する場所がありません。

于 2012-07-14T07:33:33.953 に答える