Каковы преимущества использования DispatchWorkItem в Swift? - PullRequest
0 голосов
/ 06 января 2019

Предположим, у нас есть следующий код, определяющий непрерывный цикл (как в игре):

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 Ответ

0 голосов
/ 06 января 2019

Класс 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 в качестве параметра. Таким образом, производительность не снизится, поскольку мы используем блоки в обоих случаях . Используйте тот, который подходит вам больше всего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...