Не правильно работает запрос в цикле

swift
ios

#1

Внутри цикла выполняется запрос get на получение списка контактов, далее контакт добавляется в базу, если прошел проверку checkLimitContact. Проблема: цикл выполняется три раза и свойство contacts.count всегда = 0. А должно contacts.count = 1, 2, 3, то есть получается:

  1. get запрос выполнился count = 0, добавился 1 контакт,
  2. следующий запрос выполнился количество count = 1 Добавился еще 1 контакт
  3. следующий запрос выполнился количество count = 2 Добавился еще 1 контакт
    А я получаю всегда count = 0, как можно это исправить? Контакты добавляются и считываются из бд без проблем, а в цикле работает не правильно
    ////

#2

Потому что запросы в сеть асинхронные )))

У вас не видно метода fetchContacts (это он ГЕТ?). Как минимум его нужно сделать со сбегающим замыканием. А также, если вы работает с запросами в цикле, то каждый запрос обязательно надо организовывать в очередь при помощи DispatchGroup, потому что один @escaping вам не поможет.


#3

да, fetchContacts он просто достает контакты по модели из книги, в любом случае я пытаюсь сделать это напрямую так:
///

и все же получаю:

вытащил из БД 0
вытащил из БД 0
вытащил из БД 0
добавил в БД Contact { … }
добавил в БД Contact { … }


#4

Так вы так и не показали метод getContacts.


#5

По порядку, getContacts мне оказался не нужен, все еще актуально, вот последние изменения
///
Вот метод, который должен возвращать bool, в переменной limit всегда изначальное значение, не умеьншается, хоть и срабатывает метод updateAmountOfContacts, dispatchQueue это serial

///
Здесь обновляю лимит

///

Вот fetchContacts

///


#6

попробуйте перенести работу с группами в цикл addNewContacts

  1. Сделайте addNewContacts с @escaping (Bool)->Void либо Result
  2. Вход в группу в начале цикла filteredContacts.forEach
  3. Выход в клоужере self.databaseManager.getUser
  4. self.dispatchGroup.notify ПОСЛЕ цикла с completion(Bool) внутри.
  5. Внутри check группы можно убрать - там же нет цикла

У меня такой подход отлично работает с файербейзом с последователным удалением каскаднно-связанных задач

У вас изначально было почти также, только нотифи был внутри цикла.


#7

Все ли я праивльно сделал? Срабатывает один раз notify

///


#8

Выход перенесите из метода в клоужер этого метода

self.check { (limits) in
    limit = limits
    self.dispatchGroup.leave()
}

Да, и не очернь понятно зачем вы постоянно храните экземпляр DispatсhGroup, когда он нужен только внутри метода.


#9

было множество экспериментов и было удобнее хранить за методами) спасибо


#10

так получилось? _____


#11

Я изменил алгоритм и запросы в цикле не понадобились, но все же спасибо большое за ответы и подход