0

実行されていることがわかっている次のコードがあります。

ReadDelegate * del = [[ReadDelegate alloc] init];
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;

CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)(@"server.com"), port, &readStream, &writeStream);

NSInputStream * readSock = (__bridge_transfer NSInputStream*)readStream;

[readSock setDelegate:del];
[readSock scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

NSOutputStream * writeSock = (__bridge_transfer NSOutputStream*)writeStream;
[writeSock scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
NSLog(@"Open socket");
[readSock open];
[writeSock open];

[writeSock write:(uint8_t*)("request\0\0\0") maxLength:10];


while (YES) {
     //I'm skipping over inconsequential stuff
}
NSLog(@"finished reading");
[readSock close];
[writeSock close];

return [del getMessage];

私の ReadDelegate クラスは次のよう@interface ReadDelegate : NSObject <NSStreamDelegate>に宣言され、- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode. その特定の関数には、呼び出されているかどうかを確認するための print ステートメントが含まれているだけです。そうではありません。

サーバーが「request\0\0\0」メッセージを受信し、サーバーがファイルを送信しているため、接続が開かれているという事実を知っています(ファイルを正常に受信できる他の環境でテストしています)。

ただし、前述のようにReadDelegate、最初に宣言されたオブジェクト (del) は、streamメッセージを一度も受信しません (ストリームが開いているなど)。

デリゲートが呼び出されないのはなぜですか?

4

1 に答える 1

1

while ループが原因で、ストリームがイベントを受信して​​いないようです。

ストリームからのすべての新しいイベントは、実行ループの新しい繰り返しで処理できます。しかし、現在の反復が終了しないため、新しい反復を開始できません。

于 2014-08-15T12:45:44.287 に答える