假设我们有以下代码定义了一个连续循环(例如游戏):
let queue = DispatchQueue(label: "DemoSerialQueue")
let workItem = DispatchWorkItem{ print("Hello World") }
func gameLoop() {
queue.async(execute:workItem)
}
在速度方面,上述代码是否比以下代码更有效:
func gameLoop() {
queue.async{ print("Hello World") }
}
尤其是我想知道第二种形式是否会在每个循环上分配一个闭包,从而确保性能下降。
答案 0 :(得分:0)
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)
}
}
通常,Dispatch函数可以使用块或 DispatchWorkItem 作为参数。因此,在两种情况下都使用块不会对性能造成任何影响。使用最适合您的那个。