iPhone

2011-01-18 11 views
5

上のセカンダリスレッド私は、サーバーとの通信に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(または一般的にループベースのクラスを処理する方法)を使用する方法を教えてもらえますか?そのクラスのメソッドを呼び出すと、メソッドが実行され、応答が受け取った?

ありがとうございます。

+1

...このような何かがあなたを助けることを願って

// call this on the main thread dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ NSData *data = [self writeData:dataToWrite]; dispatch_async(dispatch_get_main_queue(), ^{ // do something with the data on the main thread. }); }); 

:あなたはこのようにそれを行うだろうか?スレッドを作成する理由は、あなたがやっている(一見)最初のことが、将来の日付が未定義になるまでブロックするのですか?なぜ実行ループでスレッドから全体を開始し、 'NSOperationQueue'またはグローバル同時' dispatch_queue'sのいずれかで処理するため_result-DATA_を派遣しませんか? – danyowdee

答えて

-1

バックメインスレッドにデータが書き込まれた瞬間に来るよりも、別のスレッドで、あなたのデータを書き込むとするGCD(グランドセントラル派遣)を使用してみてください。あなたが最初の場所でそのシナリオを望むなぜ私は