4

セカンダリ スレッド (ターゲットは iOS4) で NSURLConnection 非同期を実行しようとしています。

1) iOS4 NSOperationQueue addOperation では、 Technical Q&A QA1712に基づいて、GCD を使用しているため、新しいスレッドで操作を開始しますが、私のテスト (シミュレーターと iPad) は、start() が常にメイン スレッドで呼び出されることを示しています。アイデア、ここでチェックが必要ですか:メインスレッドで新しいものを生成する場合?

2) addOperation() によってセカンダリ スレッドで start が実際に呼び出された場合、現在の NSRunLoop でスケジュールすることにより、非同期 NSURLConnection を開始できます。

[self.connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.connection start];

ここの LinkedImageFetcher の例のように、次のように完了するまでループする必要はありません。

do {
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
} while (!isCompelted);

3) カスタム NSOperation start() がメイン スレッドで呼び出され、2) が正しいと仮定すると、start() で新しいスレッドを生成して、次のようにカスタム main() メソッドを呼び出します。

[NSThread detachNewThreadSelector:@selector(main) toTarget:self withObject:nil];

私の main() では、現在のスレッド実行ループを実行する必要があります。

do {
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
} while (!isCompelted);

これは、並行 NSOperation で NSURLConnection を実行できた唯一のインスタンスですが、技術ノートの状態としてスレッドが GCD によって提供された場合、RunLoop を実行する必要があるかどうかはわかりません。ロジックに従うことができますか? 2)またはスレッドの実行ループを実行する必要がありますか?GCD が提供するスレッドをテストするにはどうすればよいですか?

説明してくれてありがとう

4

2 に答える 2

9

まあ、私は最終的にこれを解決したので、人々は詳細に興味があるかもしれないと思いました:

1)[[NSOperationQueue allc] init]で新しいキューを作成するのではなく、[NSOperationQueue mainQueue]を使用していたため、メインスレッドでstart()が呼び出されました。ただし、NSOperation start()で現在のスレッドがmainThreadであるかどうかを確認し、そこから直接main()を呼び出すか、新しいスレッドを生成することによって(mainThreadを使用している場合)問題はありませんでした。

2)LinkedImageFetcherは、実行ループとスレッドを理解するには複雑すぎることに気付きました。トピックはそれほど複雑ではないため、不必要にそうです。start()メソッド内で必要なのは、完了するまで(isCompleted)セカンダリスレッドの実行ループを継続することです。NSURLConnectionの実行ループはすべて、接続からの入力をリッスンし、コールバックを起動します(didreceivereponse、 didreceivedataなど)。

3)はい、同じ(この場合はセカンダリ)スレッドで接続コールバックを取得するには、実行ループを実行する必要があります。

詳細については、 『スレッドプログラミングガイド』の「ループの実行」を参照してください。

于 2011-06-04T18:59:01.890 に答える
0

あなたが達成しようとしていることを理解できません: NSURLConnection API には組み込みの非同期メソッド initWithRequest:delegate: があります。

これを使用できない特定の理由はありますか?

于 2011-04-30T13:01:50.660 に答える