Необходимо вызывать API асинхронно и немедленно обновлять пользовательский интерфейс, а не ждать завершения всего API в Swift.

У меня есть страница PLP, мне нужно нажать стандартный API для всех продуктов, видимых на экране, и мне нужно обновить стандартный пользовательский интерфейс для каждого продукта после получения ответа для каждого продукта, я реализовал это с помощью Dispatch Semaphore, но столкнулся со сбоем при навигации между экранами, и я пытался использовать очередь операций, но в этом случае я получаю ответ в кумулятивное время всех обращений к API. Даже я пробовал с группой Dispatch, она также отвечает так же, как очередь операций.

Один API занимает около половины секунды, поэтому каждый товарный запас должен обновляться от половины до 1 секунды, это то, что мне нужно, любая помощь приветствуется.

Пробовал код с использованием Operation Queue

      var queue: OperationQueue?
queue = OperationQueue()
queue?.qualityOfService = .background

productListView.sendCBRClosure = { [unowned self] cbrCodeArray in
        queue?.maxConcurrentOperationCount = 5
        for cbrCode in cbrCodeArray {
            queue?.addOperation {
               self.getStockDetail(cbrCode: cbrCode) // API call
            }
        }
    }

Пробовал код с использованием Dispatch Semaphore

      var semaphore = DispatchSemaphore(value: 4)
productListView.sendCBRClosure = { [weak self] cbrCodeArray in
        DispatchQueue.global().async { [weak self] in
            for cbrCode in cbrCodeArray {
               //API call
               self?.getStockDetail(cbrCode: cbrCode) { qtyStr in
                   self?.semaphore.signal() // after API response received
               }
               self?.semaphore.wait()
            }
       

1 ответ

Сетевые вызовы Apple с использованиемуже выполняются асинхронно в фоновом потоке. Нет причин нуждаться в очередях операций, DispatchQueue и т.д.

Просто отправьте отдельный запрос для каждого элемента, и код обработки ответа обновит пользовательский интерфейс при вызове основного потока. (Вы не можете выполнять вызовы UIKit из фонового потока.)

Каждая сетевая операция будет выполняться отдельно и после завершения вызывать обработчик завершения.

Другие вопросы по тегам