Поскольку мы знаем, что
- функция executeWait синхронно выполняет данный блок в очереди контекста.
- Функция выполнения асинхронно выполняет заданный блок в очереди контекста.
В моем проекте я использовал функцию executeWait для извлечения данных, потому что я хочу, чтобы вызывающий поток ждал до тех пор, покаблок выполнен перед возвратом.Это самый простой способ реализовать это.Но потом я понял, что executeWait работает очень медленно.Затем я попытался реализовать собственную синхронизацию с семафором и использовать функцию выполнения.Вот результаты:
PerformWait
let currentTime1 = getCurrentMillis()
context?.performAndWait({
....
})
let currentTime2 = getCurrentMillis()
let diff = currentTime2 - currentTime1
print("getActivities diff: " + String(diff))
Выполнить и семафор
let currentTime1 = getCurrentMillis()
let semaphore = DispatchSemaphore(value: 0)
context?.perform({
....
semaphore.signal()
})
semaphore.wait()
let currentTime2 = getCurrentMillis()
let diff = currentTime2 - currentTime1
print("getActivities diff: " + String(diff))
getActivities diff: 1248мс
getActivitiesWithSemaphore diff: 90 мс
ОК, я знаю, что это проще.Но почему это так медленно?Каковы другие преимущества его использования по сравнению с функцией выполнения?