0

我正在使用新的 dispatch_queue 来接收 Xmpp 消息,同时更新我的​​标签栏计数我正在发送通知。但更新我的 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 更新相关的代码?我见过有人报告无法解释的减速,然后说“哦,我不知道这也包括 Core Graphics”。我知道这不太可能,但请仔细检查。

  • 这是一个愚蠢的问题,但你有没有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”工具运行应用程序。有关如何使用该工具的演示,请参阅有关构建并发用户界面的 WWDC 2012 会议。

这些是唯一让我跳出来的想法。

于 2012-11-29T12:21:50.903 回答