Мое приложение - игра головоломки для числа головоломок, которые получены из латинской площади. Загадки не Судоку -головоломки, но в некоторых отношениях похожи. В настоящее время приложение работает на iOS 15 и позже. Я хотел бы, чтобы это было так, по крайней мере, на некоторое время, если возможно. Это работает, генерируя латинскую площадь случайным образом, а затем видя, можно ли превратить его в решаемую головоломку с уникальным решением. Скорость попадания очень низкая, поэтому процесс генерации очень интенсивный процессор. Как только любая из четырех задач находит действительную головоломку, процесс генерации успешно. Три задачи, которые не генерировали головоломку, просто отменены. Задачи начали с использованием Dispatchqueue.global (qos: .userinitiated) .async и синхронизированный с использованием семафора. Сейчас я пытаюсь преобразовать это в структурированную параллелизм, используя Async/await .
Проблема
Новый подход к генерации головоломки использует группу задач . Четыре задачи добавляются в группу задач, затем, как только первая задача получила загадку, остальные три задачи отменяются. Однако, работая на iOS 15, кажется, что задачи не работают параллельно. Это, по крайней мере, мой вывод, основанный на загрузке процессора, который наблюдается при запуске из XCode с симулятором: < /p>
- При запуске любого симулятора для версий iOS 16 и выше нагрузка ЦП на Mac составляет от 300 до 400% -> OK. Нагрузка на процессор составляет около 100% -> nok.
Ниже приведена упрощенная версия генератора. Процесс генерации, интенсивной процессора, эмулируется путем генерации случайных чисел в диапазоне 0 ..
Код: Выделить всё
struct Puzzle {
let val: Int
}
struct PuzzleGenerator {
let index: Int
func generatePuzzle() async -> Puzzle? {
var val: Int
repeat {
val = Int.random(in: 0.. 0 && !Task.isCancelled
if val == 0 {
print("puzzle generated successully by generator \(index)")
}
return val > 0 ? nil : Puzzle(val: val)
}
}
enum GeneratorCommand {
case wait
case generate
case abort
}
struct ContentView: View {
@State private var command = GeneratorCommand.wait
@State private var elapsedSecs: Int?
private nonisolated func generatePuzzle() async -> Puzzle? {
await withTaskGroup(of: Puzzle?.self) { group in
// Add 4 worker tasks to the group
for i in 0..
Чтобы увидеть проблему, нажмите кнопку «генерировать головоломку» и наблюдать за нагрузкой процессора. < /p>
Напомним, проблема происходит только с ios 15 < /strong>, он работает нормально на IOS -версиях 16 и выше. 16 и выше, только одна задача генератора сообщает успех (заявление печати). С iOS 15 все 4 задачи генератора сообщают о успешном завершении. Может быть, есть простое объяснение с тем, как работает int.random
Подробнее здесь: https://stackoverflow.com/questions/796 ... ith-ios-15