我使用新的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];
});
});
任何人都可以帮助处理通知过程而不冻结......
答案 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会议,了解如何使用该工具。
这些是我跳出来的唯一想法。