0

NSOperation で NSURLConnection を使用する方法を示すこのソースコードを研究しています: リンク

行のコードについて混乱しています76

if (![NSThread isMainThread])
    {
        [self performSelectorOnMainThread:@selector(start)
                               withObject:nil waitUntilDone:NO];
        return;
    }

コードがメイン スレッドで実行されるように作成者が確認するのはなぜですか?

ブロックしないように、メインスレッドとバックグラウンドスレッドで実行しないことが NSOperation の全体的なポイントではありませんか?

私の質問には答えませんが、コードはこの記事からのものです

4

5 に答える 5

1

NSURLConnection docsから、次のことがわかります。

NSURLConnection のデリゲート メソッド (NSURLConnectionDelegate プロトコル プロトコルによって定義される) を使用すると、オブジェクトは、URL 要求の非同期ロードに関する情報コールバックを受け取ることができます。[...]これらのデリゲート メソッドは、関連する NSURLConnection オブジェクトの非同期ロード操作を開始したスレッドで呼び出されます。

NSURLConnection での操作の開始はどのスレッドでも機能しますが、たとえば進行状況を表示したい場合は、GUI/メイン スレッドでデリゲート コールバックを取得すると非常に便利です。

于 2013-01-13T21:42:03.603 に答える
0

メイン スレッドで start メソッドを呼び出すと、現在の操作のメイン メソッドがメイン スレッドで実行されますが、現在の操作を NSOperationQueue (メイン キューではない) にプッシュし、サブ スレッドでメソッド呼び出しを開始し、サブ スレッドで現在の操作のメイン メソッドを呼び出します。

サブスレッドの写真

サブスレッドのメイン メソッド

于 2016-06-01T08:24:36.980 に答える
-1

これが例である場合、そこにそのコードがある場合とない場合の違いを確認するために、これがそこに入れられていると思います。このコードが同時に実行され、メインスレッドを存続させることになっている場合、実際にはコードのそのセクションはそこにあるべきではありませんが、違いを削除して確認するためにそこに配置されている可能性があります。しかし、あなたは確かに正しいです。ファイルの残りの部分を閲覧すると、メインスレッドを開いたままにしておきたい場合は、そこにあるべきではないように見えます。

于 2013-01-13T21:37:52.370 に答える
-1

その理由は、iOS 4.0 以降では、操作が並行しているかどうかにかかわらず、操作はバックグラウンド スレッドで実行されるためです。この場合、操作は並行であるため、メソッドはすぐに存在し、スレッドは強制終了されるため、デリゲート メソッドは呼び出されません (NSURLConnection は、開始元のスレッドでデリゲート メソッドを呼び出します)。

唯一のオプションは、NSRunLoop を開始する (非常に忙しい) か、既に 1 つあるスレッド (メイン スレッド) を使用することです。そのため、start メソッドはメイン スレッドから実行されます。

多くの人が示唆しているように、UI の更新とは関係ありません (要点は理解していますが、キューで NSURLConnection を実行する全体的な理由は、UI のブロックを回避するために別のスレッドでデリゲート コールバックを処理することです)。それは作者の意図ではなく、UIKit に対して安全であるという事実は単なる結果です。

于 2013-01-14T02:54:52.987 に答える