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

glo*_*loo 19 parallel-processing optimization swift

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

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

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

func gameLoop() {
  queue.async{ print("Hello World") }
}
Run Code Online (Sandbox Code Playgroud)

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

小智 32

DispatchWorkItem 类是对工作项概念的封装。好处很少。

调度工作项具有取消标志。如果它在运行之前被取消,调度队列将不会执行它并跳过它。如果它在执行期间被取消,则取消属性返回 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

通常,Dispatch 函数可以将DispatchWorkItem作为参数。所以不会有任何性能下降,因为我们在这两种情况下都使用。使用最适合您的那一种。