2016-09-20 107 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子類,稱爲viewDidLoadviewDidAppear

UPDATE:

我知道,因爲在IOS中的錯誤,在這裏需要:

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

如果在viewDidLoadviewDidApperar中調用是無用的。 但是你可以用類似的代碼檢查:

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時可能會觀察到延遲。

你可以用現在斯威夫特3語法使用它:

DispatchQueue.main.async { 
    // your code 
} 
相關問題