【问题标题】:How to process dispatch async process in background?如何在后台处理调度异步进程?
【发布时间】:2012-11-29 11:26:27
【问题描述】:

我正在使用新的 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];
});
});

任何人都可以帮助解决这个问题,以处理通知过程而不会冻结...

【问题讨论】:

    标签: iphone ios xcode


    【解决方案1】:

    上面的语法看起来不错,并采用了适当的技术将任务分派到后台进程,然后将 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 中的“时间分析器”工具运行应用程序。请参阅Building Concurrent User Interfaces 上的 WWDC 2012 会议,了解如何使用该工具。

    这些是我唯一想到的想法。

    【讨论】:

    • 我在开始时尝试了第二个代码,同样的减速发生了......当我将全局队列切换到主队列时,在更新 uitabbar 计数时会发生小冻结.. 如何控制冻结,如果我不切换到主队列,则不会发生冻结,但 tabbarcount 需要更多时间来改变......希望你能帮助我.. 这个.....
    • 除了主队列还有其他方法可以使 UItabbar 计数快速变化而不会冻结...
    • @RahulNair 那么,“re-dispatched”消息是否快速显示,并且标签栏变化缓慢?还是“重新发送”NSLog 消息也显示缓慢?
    • 在回答您的问题时,我发现标签栏更新几乎是即时发生的,所以如果您遇到一些延迟,我认为这与您的队列有关。
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 2019-10-25
    • 2018-12-26
    • 1970-01-01
    相关资源
    最近更新 更多