2016-09-20 20 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 
} 
相关问题