#swift
#swift
Вопрос:
Мне нужно выполнить несколько трудоемких операций. Каждый из них включает в себя большие математические вычисления и создание объектов GMS и занимает примерно 10 секунд. Он использует уведомления в нескольких местах.
У меня есть параметры для каждой операции в словаре, и я попытался использовать простой цикл for для выполнения операций одну за другой, но вычисления не упорядочены должным образом. Количество вычислений может отличаться, поэтому мне нужен некоторый цикл для просмотра словаря.
Я подумываю о том, чтобы ждать в цикле до получения уведомления о выполнении следующего цикла. Я знаю, где опубликовать уведомление, но не могу найти никакого решения, как наблюдать за ним в цикле for. Правильный ли это подход, и если да, то как это сделать?
Есть предложения?
Правка1: Пример:
For calculation in calculationsDict {
performCalculation(calc: calculation) // runs 10s in different threads
}
Как отложить второе и любое последующее вычисление выполнения до момента, когда каждое вычисление выполнения полностью завершено?
Edit2: performCalculation имеет вложенные функции, он отправляет уведомления для инициирования других действий, и все действия вместе содержат сотни строк кода, и в результате в mapview появляется много объектов. Что мне нужно, так это повторить всю эту кучу действий (здесь называемых performCalcultion()), но в самый раз, когда предыдущее будет завершено полностью.
Edit3: Я прошу о том, как сделать так, чтобы один performCalculation() имел обработчик завершения для следующего performCalculation() .
Комментарии:
1. Неясно, о чем вы спрашиваете, поэтому, возможно, вы можете немного прояснить свой вопрос, возможно, с помощью какого-нибудь примера кода. Может быть, вы могли бы создать массив своих операций или использовать Combine, трудно дать какой-либо надежный совет без дополнительной информации
2. Действительно, неясно, как вы собираетесь использовать вложенный цикл. Можете ли вы предоставить какой-нибудь код?
3. Код настолько сложный, что я понимаю, что мой вопрос довольно общий. Я могу получить желаемый результат при выполнении performCalcultion() один за другим, и это то, что я делаю в начале. Все входные данные отсортированы, и я сохраняю их в формате json. Если мне нужно воспроизвести все желаемые результаты, я загружаю параметры из json, а затем мне нужно поместить эти вычисления в очередь, но все они зависят от предыдущего, поэтому мне нужно запустить новый после завершения предыдущего.
Ответ №1:
Вашему performCalculation(calc:)
методу определенно нужен параметр завершения закрытия, чтобы мы знали, когда выполняются вычисления для данного ввода. Допустим, теперь это выглядит так, и вы выполняете завершение, когда все ваши внутренние асинхронные задачи завершены:
func performCalculation(calc: ..., completion: @escaping () -> Void) {
// Call when all done
completion()
}
Затем я бы предложил реализовать метод, который будет рекурсивно вызывать сам себя и передавать необходимый dict в метод выше:
func performAllCalculations(with calculationsDict: ...) {
guard calculationsDict.count > 0, let calculation = calculationsDict.first else {
// Terminate recursion when the dict is empty
return
}
// Calculate with the first item from the dict
performCalculation(calc: calculation) { [weak self] in
// Calculation is done
// Call the main method again without the first item in the dict
self?.performAllCalculations(with: calculationsDict.dropFirst())
}
}
Комментарии:
1. Я использовал редактирование, чтобы добавить сюда свой комментарий ISO comment, извините за это.
2. Я реализовал ваш код, и проблема в том, что performCalculation имеет внутреннюю функцию, которая отправляет уведомление для запуска других функций, и завершение performCalculation вызывается до завершения всех этих действий. Что возвращает меня к моей идее, как дождаться в performCalculation некоторого уведомления перед вызовом completion() ..