2016-09-20 3 views
0

Это то, что я встретил в одном из проектов:Как отлаживать текущую очередь в dispatch_async?

private func updateBadgeView() { 

    dispatch_async(dispatch_get_main_queue()) { 

     if UIApplication.sharedApplication().applicationIconBadgeNumber > 0 { 

      self.newMessagesBadgeView.hidden = false 
      self.newMessagesCountLabel.text = String(UIApplication.sharedApplication().applicationIconBadgeNumber) 

     } else { 
      self.newMessagesBadgeView.hidden = true 
     } 
    } 
} 

И я полагаю, что dispatch_async с этой очередью бесполезно здесь. Как я могу проверить очередь здесь? Мне действительно нужен этот блок? Мне нужно проверить, является ли она той же самой очередью, что и без блока.

выше функция находится внутри подкласса UIViewController и называется в viewDidLoad и viewDidAppear

UPDATE:

Я знаю, что из-за ошибки в ИО, нужно здесь:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    dispatch_async(dispatch_get_main_queue()) { 
     self.presentOverlayController(selectViewController) 
    } 
} 
+0

Вы хотите, чтобы проверить, если метод уже работает на главную очереди? См. Http://stackoverflow.com/questions/5662360/gcd-to-perform-task-in-main-thread. Но viewDidLoad и т. Д. * Вызывается в основной очереди. –

+0

Странно, мне никогда не нужно это делать, что произойдет, если вы удалите dispatch_async –

ответ

1

Если оно вызвано в viewDidLoad и viewDidApperar бесполезно. Однако вы можете проверить с аналогичным кодом:

private func updateBadgeView() { 

    let block = { 
      if UIApplication.sharedApplication().applicationIconBadgeNumber > 0 { 

      self.newMessagesBadgeView.hidden = false 
      self.newMessagesCountLabel.text = String(UIApplication.sharedApplication().applicationIconBadgeNumber) 

     } else { 
      self.newMessagesBadgeView.hidden = true 
     } 
    } 

    if ([NSThread isMainThread]) { 
     block(); 
    } else { 
     dispatch_async(dispatch_get_main_queue()) { 
     block(); 
     }  
    } 
} 
+0

Я пробую его сейчас ... –

+0

Если я отлаживаю, как вы сказали, это нормально ... в обоих случаях (внутри блока и без него есть основной поток). Но это то же самое для 'didSelectRowAtIndexPath:'. Существует также основная тема для обоих, но отправка должна быть там, чтобы заставить ее работать? –

+0

Я полагаю, что использует 'dispatch_async (dispatch_get_main_queue())' не для переключения между потоками, а для запуска кода в следующем событии в цикле событий. Иногда приходится обрабатывать анимации и т. Д. –

1

Наверняка applicationIconBadgeNumber используется в различных очереди. Если вы не используете dispatch_async(dispatch_get_main_queue()), вы можете наблюдать за задержкой при обновлении newMessagesCountLabel.

Вы можете использовать его с Swift 3 синтаксическими:

DispatchQueue.main.async { 
    // your code 
} 
Смежные вопросы