RunLoop vs DispatchQueue в качестве планировщика - PullRequest
2 голосов
/ 23 июня 2019

При использовании новой платформы Combine вы можете указать планировщик получения элементов от издателя.

Существует ли большая разница между RunLoop.main и DispatchQueue.main в этом случае при назначении издателя для элемента пользовательского интерфейса?Первая возвращает цикл выполнения основного потока, а вторая очередь связана с основным потоком.

1 Ответ

2 голосов
/ 06 июля 2019

Я разместил аналогичный вопрос на Swift Forum. Я призываю вас увидеть обсуждение https://forums.swift.org/t/runloop-main-or-dispatchqueue-main-when-using-combine-scheduler/26635.

Я просто скопировал и вставил ответ от Philippe_Hausler

RunLoop.main как планировщик завершается вызовом RunLoop.main.perform, тогда как DispatchQueue.main вызывает DispatchQueue.main.async для выполнения работы, для практических целей они почти изоморфны. Единственная реальная разница заключается в том, что вызов RunLoop заканчивается тем, что он выполняется в другом месте в выносках RunLoop, тогда как вариант DispatchQueue, возможно, будет выполняться немедленно, если оптимизация в libdispatch включится. На самом деле вы никогда не увидите разницу между двумя.

RunLoop должен быть, когда у вас есть выделенный поток с запущенным RunLoop, DispatchQueue может быть любым сценарием очереди (и для записи, пожалуйста, избегайте запуска RunLoops в DispatchQueues, это вызывает некоторое действительно грубое использование ресурсов ...). Также стоит отметить, что DispatchQueue, используемый в качестве планировщика, всегда должен быть последовательным, чтобы придерживаться контрактов операторов комбайна.

...