Вызовите функцию по одному, используя Dispatch в главной очереди. - PullRequest
1 голос
/ 09 февраля 2020

Я пытаюсь использовать диспетчеризацию в swift. Программа, которую я хочу создать, представляет собой диаграмму. Отправка должна выполняться в главной очереди, так как метод A использует UIAPI.

Мой текущий код выглядит следующим образом.

  let serialQueue = DispatchQueue.main
  var count = 0

    serialQueue.async {
        if count == 0{
            TestHelper().methodA(title: title, art: art) { (url) in
                if url != nil{
                    completion(url)
                }else{
                    count += 1
                }
            }
        }
        print(count)
        if count == 1{
            TestHelper().methodB(title: title, art: art) { (url) in
                if url != nil{
                    completion(url)
                    return
                }else{
                    count += 1
                }
            }
        }

Проблема с этим кодом заключается в том, что он не ждет для метода A до fini sh и проверяет, что подсчет, делающий метод B не выполненным.

enter image description here Любая помощь приветствуется

1 Ответ

0 голосов
/ 09 февраля 2020

Если вы хотите, чтобы он работал в главной очереди, вам не нужна очередь отправки. Все, что вам нужно - это дождаться срабатывания обратного вызова и затем запустить следующую операцию. Это можно решить разными способами. (Я предполагаю, что методы запускаются asyn c).

  1. Вы можете вкладывать свои операции в обратный вызов предыдущей единицы работы. Это легко, но быстро превращается в «пирамиду гибели».
  2. Вы можете использовать что-то вроде Promises, чтобы связать эти операции. Это было бы моим решением go, но для этого вам нужен внешний пакет.
  3. Вы можете поместить все эти операции в функцию, которую вы вызываете с помощью count в каждом блоке завершения. Это самое близкое к вам то, что вы написали сейчас:
func doWork(_ count: Int) {
  if count == 0 {
    TestHelper().methodA(title: title, art: art) { (url) in
        if url != nil {
            completion(url)
        } else {
            doWork(count + 1)
        }
      }
    }
  } else if count == 1 {
    TestHelper().methodB(title: title, art: art) { (url) in
        if url != nil {
            completion(url)
        } else {
            doWork(count + 1)
        }
      }
  } else if count == 3 {
    // ... etc
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...