如何在后台处理调度异步过程?

时间:2012-11-29 11:26:27

标签: iphone ios xcode

我使用新的dispatch_queue接收Xmpp消息,同时更新我的​​tabbar计数iam发送通知。但是更新我的Uitabbar计数需要更多时间。所以我用dispatch_queue_main()单独调用通知过程。但它会让我的应用程序在更新我的tabbar计数时冻结几秒钟。

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];
});
});

任何人都可以帮助处理通知过程而不冻结......

1 个答案:

答案 0 :(得分:3)

上面的语法看起来很好,并使用适当的技术将任务分派给后台进程,然后将UI更新重新分派回主队列。所以,你可能不得不扩大你的调查范围。考虑到这一点,您可能需要考虑:

  • 您是否绝对确定在“处理邮件的代码”部分下没有任何与UI更新相关的代码?我看到人们报告无法解释的缓慢下降,然后说“哦,我不知道包括核心图形,”。我知道这不太可能,但请仔细检查。

  • 这是一个愚蠢的问题,但你有没有把NSLog语句放在这里,就在这两个块的开头?通过这样做,您可以确认哪个队列是罪魁祸首(如果有的话),更好地了解队列的进入和退出等。不知道您的代码,我担心“处理消息的代码”花费的时间太长。 / p>

    所以你可能会:

    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会议,了解如何使用该工具。

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