0

iPhone アプリでは、wifi 経由のソケット接続があり、inputStream から読み取り、outputStream に書き込む必要があります。問題は、ストリーム管理がイベント駆動型であり、読み取る前にイベント NSStreamEventHasBytesAvailable を待たなければならないことです。したがって、handleEvent:eventCode デリゲート メソッドの外側でいつ読み書きするかわかりません。

while ループを試してみましたが、while ループ中にアプリがデリゲート メッセージを受信せず、停止しないことに気付きました。

擬似コード:

-(void) myFunction {
   canRead=NO;
   [self writeToStream:someData];
   while(!canRead) { };
   readData=[self readFromStream];
}

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

    switch(eventCode) {
          case NSStreamEventHasBytesAvailable: {
        canRead=YES;
        break;
      }
       }
}

デリゲート メソッド内では読み書きできると思いますが、その外側では何度も読み書きする必要があります。

ヘルプ!ありがとうございました

4

1 に答える 1

-1

ストリーム クラスは、"stream:handleEvent:" を呼び出すイベントを EventQueue に配置した可能性があります。コードがイベント ハンドラーに制御を返さない場合、イベント キューを読み取ることができません。その方法の代わりにおそらくやりたいことは次のとおりです。

http://developer.apple.com/iphone/library/documentation/cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/performSelectorOnMainThread:withObject:waitUntilDoneを参照してください。

Cocoa プログラミングの概要: http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CoreAppArchitecture/CoreAppArchitecture.html#//apple_ref/doc/uid/TP40002974-CH8-SW45

-(void)myFunction1 {
  [self writeToStream:somedata];
}
-(void)myFunction2 {
  readData=[self readFromStream];
}
- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
    switch(eventCode) {
          case NSStreamEventHasBytesAvailable: {
            [self myFunction2];
        break;
      }
       }
}
于 2009-11-29T17:34:28.073 に答える