長い間ウェブを検索していたのですが…答えが見つからなかったので、ここに投稿することにしました。NSStreamを使用してNNTPサーバーへの接続を確立しようとしています。
テストプログラムでは、ストリームを開いてメッセージを送信します。デリゲートメソッド(stream:handleEvent:
)は、出力ストリーム(NSStreamEventOpenCompleted
、NSStreamEventHasSpaceAvailable
)に対して2回呼び出されますが、入力ストリームに対しては呼び出されません。
入力ストリームがデリゲートを呼び出さないのはなぜですか?何か案は?
基本的に、コードは次のようになります。
初期化およびオープンストリーム:
CFReadStreamRef tmpiStream;
CFWriteStreamRef tmpoStream;
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)SERVER, PORT, &tmpiStream, &tmpoStream);
iStream = (__bridge NSInputStream *) tmpiStream;
oStream = (__bridge NSOutputStream *)tmpoStream;
[iStream setDelegate:self];
[oStream setDelegate:self];
[iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[iStream open];
[oStream open];
メッセージを送る:
NSData *data = [[NSData alloc] initWithData:[messageString dataUsingEncoding:NSASCIIStringEncoding]];
[oStream write:[data bytes] maxLength:[data length]];
メッセージを受信する:
-(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
NSLog(@"EventCode: %i", eventCode);
//switch-case-statement...(using constants - NSStreamEventOpenCompleted...)
}
そのコードを含むクラスはNSObjectsを継承し、を実装しNSStreamDelegate
ます。(iOS5とARC)
助けてくれてありがとう!
編集:私はこのようなストリームを開いた後に「ポーリング」を試みました-それは機能しています:
while (![iStream hasBytesAvailable])
{}
uint8_t buffer[1024];
int len;
NSString *str = @"";
while ([iStream hasBytesAvailable])
{
len = [iStream read:buffer maxLength:sizeof(buffer)];
if (len > 0)
{
NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSISOLatin1StringEncoding];
if (output != nil)
{
str = [str stringByAppendingString:output];
}
}
}
NSLog(@"Response: %@", str);
しかし、確かに、私はまだより良い(非同期)ソリューションが必要です;)