5

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 を使用する方法 (または、一般的に実行ループ ベースのクラスを処理する方法) を教えてもらえますか?そのクラスのメソッドを呼び出すと、メソッドが実行されて応答が受信されるまでブロックされますか?

ありがとうございました。

4

1 に答える 1

-1

(Grand Central Dispatch) を使用GCDして別のスレッドにデータを書き込み、データが書き込まれた瞬間にメイン スレッドに戻ってみてください。次のようにできます。

// 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.
    });
});

このようなものがあなたに役立つことを願っています...

于 2012-02-03T16:15:56.383 に答える