-1

私のコードでは、すべてのネットワーク ルーチンを別の NSThread で実行する必要があります。通信用のコールバック ルーチンを渡すライブラリがあります。

my thread code
    library
        my callback (networking)
    library
my thread code

私のコールバック ルーチンは、いくつかのデータを HTTP サーバー (NSURLConnection) に POST し、応答を待って (NSRunLoop を開始しますか?)、ライブラリに戻る必要があります。
その後、ライブラリがデータを処理します。ライブラリがスレッドに戻った後、描画とユーザー入力を処理するメイン スレッドに通知を投稿できます。

NSThread で NSURLConnection を使用する方法をカバーするサンプル コードはありますか?

4

5 に答える 5

1

Kelvinのリンクは無効です。これは、要求していることを実行するコードです([NSThread detachNewThreadSelector:toTarget:WithObject:]によって呼び出されるメソッドで実行されることを意味します)。実行ループに入ると、接続は基本的にsooとして機能し始めます。また、「terminateRunLoop」は、開始時にBOOLに設定され、接続の読み込みが完了するかエラーが発生したときにYESに設定されることを意味します。

同期要求をブロックする代わりに、なぜこれを実行したいのですか?その理由の1つは、長時間接続している接続が多くない場合でも、接続を適切にキャンセルできるようにしたい場合があるためです。また、メインの実行ループで多数の非同期リクエストが発生し始めると、UIが少しハングアップするのを見てきました。

NSURLConnection *connection = [[NSURLConnection connectionWithRequest:request delegate:self] retain];
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
while(!terminateRunLoop) 
{
    if ( ![[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode 
                                   beforeDate:[NSDate distantFuture]]) 
        {  break; }

        [pool drain];
    }
    [pool release];
}
于 2009-03-27T01:26:18.590 に答える
1

作業が完了するまでブロックする必要があり、すでに別のスレッドにいる場合は、+[NSURLConnection sendSynchronousRequest:returningResponse:error:]. ただし、これは少し鈍いので、さらに制御が必要な場合はNSURLRequest、現在のNSRunLoop. その場合、1 つの方法として、デリゲートが完了したときにフラグを立て、フラグが設定されるかタイムアウトを超えるまで、実行ループがイベントを処理できるようにすることが考えられます。

于 2008-10-05T09:20:37.197 に答える
0

ミニ質問「NSRunLoop を開始しますか?」に答えるには:

よくわかりませんが、上記の疑似コードはすべてセカンダリ スレッド (つまり、メイン イベント処理スレッドではない) で実行されていると言っているようです。その場合、HTTP サーバーが応答するのを待っている間は有用な作業を行うことができないため、おそらく NSRunLoop を作成しても意味がありません。スレッドをブロックさせてください。

于 2008-10-02T00:48:10.250 に答える
0

スレッドを使用している特定の理由はありますか? 多くの接続を開いている場合を除き、メイン スレッドの NSRunLoop で十分です。応答でブロック作業を行う必要がある場合は、スレッドを作成してください。

于 2008-12-10T00:02:51.413 に答える
0

NSURLConnection は、バックグラウンド スレッド (NSThread または NSOperation など) で、非同期デリゲート メソッドを介して同期的に使用できます。ただし、NSRunLoop の仕組みに関する知識が必要です。

サンプルコードと説明が記載されたブログ投稿があります: http://stackq.com/blog/?p=56

サンプル コードは画像をダウンロードしますが、この概念を使用して、REST API への洗練された POST 呼び出しを行いました。

-ケルビン

于 2008-12-09T23:01:09.260 に答える