0

Xmppメッセージを受信するために新しいdispatch_queueを使用していますが、通知を送信するタブバーの数を更新しています。しかし、Uitabbar カウントの更新には時間がかかります。だから私はdispatch_queue_main()で通知プロセスを単独で呼び出します。しかし、タブバーのカウントを更新している間、アプリが数秒間フリーズします..

dispatch_queue_t exampleQueue = dispatch_queue_create( "xmpp_message", NULL );
dispatch_async(exampleQueue, ^{
// code for proceesing messages....

 dispatch_queue_t queue=dispatch_get_main_queue();
dispatch_async(queue, ^{
    [self sendNotification:msg];
});
});

フリーズせずに通知プロセスを処理するために、誰でもこれを手伝ってくれます...

4

1 に答える 1

3

上記の構文は適切に見え、タスクをバックグラウンド プロセスにディスパッチするための適切な手法を採用していますが、UI の更新をメイン キューに再ディスパッチしています。したがって、おそらく調査を拡大する必要があります。それを念頭に置いて、次のことを検討してください。

  • 「メッセージを処理するためのコード」セクションに UI 更新関連のコードが含まれていないことを確信していますか? 原因不明のスローダウンを報告し、「コア グラフィックスも含まれているとは知らなかった」などと言う人を見たことがあります。可能性が低いことは承知していますが、慎重に確認してください。

  • NSLogばかげた質問ですが、両方のブロックの開始時に、ここにステートメントを入れましたか? これを行うことで、どのキューが原因であるかを確認したり (いずれかの場合)、キューの出入りをよりよく理解したりすることができます。コードがわからない場合、「メッセージを処理するためのコード」に時間がかかりすぎているのではないかと心配になります。

    したがって、次のことができます。

    dispatch_queue_t exampleQueue = dispatch_queue_create( "xmpp_message", NULL );
    dispatch_async(exampleQueue, ^{
    
        NSLog(@"%s dispatched to xmpp_message", __FUNCTION__);
    
        // code for processing messages....
    
        dispatch_queue_t queue = dispatch_get_main_queue();
        dispatch_async(queue, ^{
    
            NSLog(@"%s     re-dispatched to main queue", __FUNCTION__);
    
            [self sendNotification:msg];
    
            NSLog(@"%s     finished dispatch to main queue", __FUNCTION__);
        });
    
        NSLog(@"%s finished dispatched to xmpp_message", __FUNCTION__);
    });
    
    // if not ARC or supporting iOS versions prior to 6.0, you should release the queue
    
    dispatch_release(exampleQueue);
    
  • また、カスタム キューのシリアルな性質に起因する問題が発生していないことを確認することもできます。シリアルの性質が必要ですか、それとも同時キューを検討できますか?

    だから試してください:

    dispatch_queue_t exampleQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // or in  recent versions of iOS, you can use dispatch_queue_create( "xmpp_message", DISPATCH_QUEUE_CONCURRENT );
    dispatch_async(exampleQueue, ^{
    
        NSLog(@"%s dispatched to xmpp_message", __FUNCTION__);
    
        // code for processing messages....
    
        dispatch_queue_t queue = dispatch_get_main_queue();
        dispatch_async(queue, ^{
    
            NSLog(@"%s re-dispatched to main queue", __FUNCTION__);
    
            [self sendNotification:msg];
        });
    });
    
  • 最後に、 Instrumentsの「Time Profiler」ツールを使用してアプリを実行してみてください。このツールの使用方法のデモンストレーションについては、Building Concurrent User Interfacesに関する WWDC 2012 セッションを参照してください。

それらは私に飛び出す唯一のアイデアです。

于 2012-11-29T12:21:50.903 に答える