Почему мы используем executeWait в основных данных? - PullRequest
0 голосов
/ 14 декабря 2018

Поскольку мы знаем, что

  • функция 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 мс

ОК, я знаю, что это проще.Но почему это так медленно?Каковы другие преимущества его использования по сравнению с функцией выполнения?

...