2016-09-13 2 views
0

Так у меня есть этот код ниже:Swift iOS: Как заставить цикл с асинхронным кодом работать синхронно?

func handleSendPost() { 
    let postRef = Global.FIRDB!.child("posts").childByAutoId() 

    for p in postComponents { 
     var values: [String : Any] = ["type": p.type!.rawValue, "text": p.text] 

     let childRef = reference.childByAutoId() 
     childRef.updateChildValues(values, withCompletionBlock: { 
      (err, ref) in 

      if err != nil { 
       print(err) 
       return 
      } 

      // object successfully saved 
     }) 
    } 
} 

Это в основном приложение IOS для блогов. Когда кто-то создает сообщение, он разбивается на компоненты, которые могут быть текстом или изображением. После завершения редактирования он будет сохранен в Firebase, вызвав функцию асинхронизации updateChildValues. Проблема в том, что я хочу поддерживать порядок postComponents. Если я запустил код выше, порядок может испортиться, потому что это зависит от того, как быстро работает updateChildValues.

Я уже пробовал использовать DispatchSemaphore (iOS 10) безрезультатно.

+1

Как насчет http://stackoverflow.com/questions/27177268/how-to-run-synchronically-two-functions-with-async-operations-on-ios-using-swift – rmaddy

+0

@rmaddy hmm, который может работать. но я бы предпочел более чистое решение, не создавая массив «NSOperationQueue» благодаря btw! Я дам ему снимок – yonasstephen

ответ

1

Может быть другой способ, но я думаю, вы могли бы забыть цикл и вместо этого использовать рекурсию. Поток будет выглядеть так:

  1. Хранить элементы в массиве.
  2. Функция вызова, которая отправляет первый элемент, если в массиве имеется хотя бы один элемент.
  3. В блоке завершения, удалить первый элемент массива и повторите шаг 2.

Это будет посылать все элементы в порядке и не остановится, когда больше нет элементов.

+0

wew, это довольно фундаментальное и чистое решение; почему я не подумал об этом ... ну, я думаю, ради изучения, давайте посмотрим, есть ли у других людей другие лучшие предложения. если нет, я попробую это и проголосую за ответ – yonasstephen

+0

@yonasstephen это сработало для вас? или вы нашли другое (может быть, лучшее) решение для этого? – tonik12