iPhone で AsyncSocket を使用してサーバーと通信します。AsyncSocket は実行ループに基づいていますが、私のアプリはスレッドに基づいています。つまり、新しいスレッドを開始してデータを書き込み、同じスレッドで応答が受信されるまで待ちます。しかし、別のスレッドから AsyncSocket のメソッドを直接呼び出すことはできません。使用する必要があります。
[self performSelectorOnMainThread:@selector(writeSomeData:) withObject:dataToWrite waitUntilDone:YES];
それは機能しますが、この方法で呼び出されたメソッド「writeSomeData:」からの応答を取得できません。
メソッド writeSomeData: は、次のようなことを行います。
-(NSData *)writeData:(NSData *)dataToWrite {
dataReceived = nil; // AsyncSocket writes data to this variable
[asyncSocket writeData:dataToWrite withTimeout:-1 tag:0];
[asyncSocket readDataToData:[@"<EOF" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
int counter = 0;
while (dataReceived == nil && counter < 5) {
// runLoop is [NSRunLoop currentRunloop]
[runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.3]];
++counter;
}
return [dataReceived copy];
}
クラス変数「dataReceived」にアクセスしてレスポンスを取得できましたが、今回は内容が変更されています。
別のスレッドで AsyncSocket を使用する方法 (または、一般的に実行ループ ベースのクラスを処理する方法) を教えてもらえますか?そのクラスのメソッドを呼び出すと、メソッドが実行されて応答が受信されるまでブロックされますか?
ありがとうございました。