Необходимо вызывать 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 с использованием
Просто отправьте отдельный запрос для каждого элемента, и код обработки ответа обновит пользовательский интерфейс при вызове основного потока. (Вы не можете выполнять вызовы UIKit из фонового потока.)
Каждая сетевая операция будет выполняться отдельно и после завершения вызывать обработчик завершения.