Swift: цепочка нескольких сетевых запросов, Alamofire - PullRequest
0 голосов
/ 10 января 2020

У меня есть вопрос о цепочке дополнительных сетевых запросов (Alamofire), но число таких запросов иногда может быть 4, иногда 9 и c, это зависит от целевых конфигураций. У меня есть один view-контроллер панели управления, и что V C имеет 4-9 встроенных V C, каждый должен получить некоторые данные из API, и это проблема, все они пытаются получить «одновременно», но Многие из них не удается, случайно.

Я использую семафор для этой проблемы, но иногда запрос не удается, не знаю почему. Я думаю, что один запрос блокирует другой или что-то в этом роде.

Например, у меня есть:

let dispatchQueue = DispatchQueue.global(qos: .background)
        dispatchQueue.async {
        if MDUtilites.isMediaPresent() {
                let _ = self.fetchMediaList()
                self.semaphore.wait()

            }
}

, и у меня есть около 10 блоков кодов, подобных этой и забавной c это:

func fetchMediaList() {
    MDApiManager.sharedInstance.fetchMediaList { (dict, status) in
        switch (status) {
        case .failed(let code, _, let description):
            print("failed:")
            print(code)
            print(description)
            self.semaphore.signal()
        case .success(_, _ , _):
            print("success")

            if let data = dict,
                let list = data.parseWith(type: MediaBase.self)?.list {
                self.newMedia = list
                NotificationCenter.default.post(name: Notification.Name(rawValue: MEDIA_UPDATE), object: nil)
                //                    self.mediaListSections = list
                //                    self.getCategories(data: list)
            }
            self.semaphore.signal()
        case .unknown:
            print("DEBUG: unknown fetchMediaList")
            self.fetchMediaList()
        //                self.semaphore.signal()
        case .error(let aError):
            print(aError)
            self.semaphore.signal()
        }
    }
}

Может кто-нибудь помочь Чтобы решить эту проблему с большим количеством запросов одновременно, Semaphore иногда работает, иногда не

1 Ответ

0 голосов
/ 10 января 2020

Вам не нужно использовать semaphore для ваших запросов. Поскольку ваш запрос выполняется асинхронно / независимо друг от друга, в зависимости от типа запроса для его выполнения требуется время. Каждый из ваших controller получает этот запрос при загрузке в память. Принеси их в ViewDidLoad(). Убедитесь, что вы правильно добавляете несколько controllers в parent controller.

...