上のセカンダリスレッド私は、サーバーとの通信にiPhone上でAsyncSocketを使用してAsyncSocketを使用します。 AsyncSocketは実行ループに基づいていますが、私のアプリはスレッドに基づいています。つまり、データを書き込むための新しいスレッドを開始し、同じスレッドで応答が受信されるまで待機します。それは作業を行いiPhone
[self performSelectorOnMainThread:@selector(writeSomeData:) withObject:dataToWrite waitUntilDone:YES];
が、私は私の方法から「writeSomeDataを:」応答を取得することはできません。しかし、私は別のスレッドから直接AsyncSocketのメソッドを呼び出すことはできません、私が使用する必要がperformSelectorOnMainThreadが戻るので、このように呼ばれます何もない。
方法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(または一般的にループベースのクラスを処理する方法)を使用する方法を教えてもらえますか?そのクラスのメソッドを呼び出すと、メソッドが実行され、応答が受け取った?
ありがとうございます。
...このような何かがあなたを助けることを願って
:あなたはこのようにそれを行うだろうか?スレッドを作成する理由は、あなたがやっている(一見)最初のことが、将来の日付が未定義になるまでブロックするのですか?なぜ実行ループでスレッドから全体を開始し、 'NSOperationQueue'またはグローバル同時' dispatch_queue'sのいずれかで処理するため_result-DATA_を派遣しませんか? – danyowdee