32

私はこのコードスニペットを見ました:

dispatch_async(dispatch_get_main_queue(), ^{
    [self doSomeNetworkStuff];
});

これは私にはあまり意味がないように見えます。

編集:私の質問の条件を明確にするために:

  • の呼び出しdispatch_asyncはメインスレッドから実行されます。
  • 送信されたメッセージdoSomeNetworkStuffは、重労働者のタスクです。
  • ...そしてUIの更新タスクだけではありません。

ディスパッチは確かですが、メインキューを使用すると、ディスパッチされたタスクがUIスレッドに戻され、ブロックされます。

お願い、何か足りないの?ありがとう。

4

6 に答える 6

38

dispatch_asyncアプリは多くのキューでタスクを実行できるため、パフォーマンスを向上させることができます。ただし、UI とやり取りするものはすべてメイン スレッドで実行する必要があります。UI に関連しない他のタスクをメイン スレッドの外部で実行して、パフォーマンスを向上させることができます。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

  //Add some method process in global queue - normal for data processing

    dispatch_async(dispatch_get_main_queue(), ^(){
    //Add method, task you want perform on mainQueue
    //Control UIView, IBOutlet all here

    });

 //Add some method process in global queue - normal for data processing

});
于 2013-03-02T02:21:38.093 に答える
8

スウィフト 3 :

DispatchQueue.global(attributes: .qosBackground).async {
    print("This is run on the background queue")

    DispatchQueue.main.async {
        print("This is run on the main queue, after the previous code in outer block")
    }
}
于 2016-06-18T17:26:32.137 に答える
6

Webservicecall などを実行する場合は、次のような非同期呼び出しをディスパッチします。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
        //Call your webservice here , your app will not freeze at all  
});

ここで、ディスパッチされたスレッドから ViewController を更新またはプッシュするとします。このスレッドから ViewController を直接プッシュすると、アプリがクラッシュするか、またはクラッシュする可能性があります。このような UI の更新はアプリのメイン スレッドで行う必要があるため、以下がこれに対する答えです。それから。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
       //Call your webservice here , your app will not freeze at all

       //To update UIFrom dispatched Thread:

       dispatch_async(dispatch_get_main_queue,^{   

       //Push view controller here
});

});

詳細については、 blackberrymastercracks.blogspot.inをご覧ください。

于 2013-05-28T12:06:11.713 に答える
5

このコードがどこから呼び出されているかによって異なります。メインキューから呼び出している場合は意味がありません。(注: クラッシュは発生しませんが、メイン キューにタスクが追加されるだけです)。

このコードがバックグラウンド スレッドで記述されている場合、これはアプリケーションの収束ポイントです。バックグラウンド スレッドで Web サービスからデータを取得し、UI で更新したい場合は、それを呼び出すことができます。

-(void) backgroundThreadFunction {

     //Some stuff on background thread. 

     dispatch_async(dispatch_get_main_queue(), ^{
         //Wants to update UI or perform any task on main thread.    
         [self doSomeNetworkStuff];
     });
}

詳細については、Apple のドキュメントhttps://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html またはこの回答からhttps://stackoverflow.com/a/を参照してください。 19822753/505735

まだ不明な場合は投稿してください。詳しい回答を書きます。

于 2014-05-09T09:57:55.783 に答える
3

通常、その構文はdispatch_async、バックグラウンド スレッドで実行される別の呼び出しの中に表示されます。これは、UI のすべての更新がバックグラウンドではなく、メイン スレッドで行われる必要があるためです。

于 2013-03-02T02:21:45.820 に答える