代码之家  ›  专栏  ›  技术社区  ›  gloo

在Swift中使用DispatchWorkItem有什么好处?

  •  0
  • gloo  · 技术社区  · 5 年前

    假设我们有以下代码定义了一个连续循环(就像在游戏中那样):

    let queue = DispatchQueue(label: "DemoSerialQueue")
    let workItem = DispatchWorkItem{ print("Hello World") }
    func gameLoop() {
      queue.async(execute:workItem)
    }
    

    以上代码在速度方面是否比以下代码更有效?

    func gameLoop() {
      queue.async{ print("Hello World") }
    }
    

    特别是,我想知道第二种形式是否会在每个循环上分配一个闭包,从而导致性能下降。

    1 回复  |  直到 5 年前
        1
  •  0
  •   Dinesh Selvaraj    5 年前

    DispatchWorkItem类是对工作项概念的封装。几乎没有什么好处。

    调度工作项具有取消标志。如果之前取消 在运行时,调度队列不会执行它并跳过它。如果它 在执行期间被取消,Cancel属性返回true。在 那样的话,我们可以中止执行

    通过将我们的请求代码封装在工作项中,我们可以很容易地在被新的请求代码替换时取消它,如下所示:

    class SearchViewController: UIViewController, UISearchBarDelegate {
        // We keep track of the pending work item as a property
        private var pendingRequestWorkItem: DispatchWorkItem?
    
        func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
            // Cancel the currently pending item
            pendingRequestWorkItem?.cancel()
    
            // Wrap our request in a work item
            let requestWorkItem = DispatchWorkItem { [weak self] in
                self?.resultsLoader.loadResults(forQuery: searchText)
            }
    
            // Save the new work item and execute it after 250 ms
            pendingRequestWorkItem = requestWorkItem
            DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(250),
                                          execute: requestWorkItem)
        }
    }
    

    通常,调度功能可以 一个街区 DispatchWorkItem 作为参数。所以在我们使用时不会有任何性能问题 两种情况下的块 . 用最适合你的。