Подтвердить что ты не робот

Постоянная очередь отправки: com.apple.root.default-qos.overcommit crash

У кого-нибудь был опыт диагностики этих сбоев? У меня есть один пользователь, получающий их последовательно, и хотя я нашел ссылку, связанную с iOS, мое приложение не сбой при одном и том же типе операции...

4b9b3361

Ответ 1

Причина:

в IOS/TVOS есть очереди/потоки, каждый поток имеет свой собственный тип или приоритет, также известный как "качество обслуживания" или короткое "QOS", что означает уровень безотлагательности, который процессор должен обрабатывать этой нитью, возможности:

  • QOS_CLASS_DEFAULT
  • QOS_CLASS_USER_INITIATED
  • QOS_CLASS_UTILITY
  • QOS_CLASS_BACKGROUND
  • QOS_CLASS_UNSPECIFIED
  • QOS_CLASS_USER_INTERACTIVE

как только вы запускаете слишком много задач одновременно в одной очереди, ОС уведомляет вас о том, что он не может выполнять все эти задачи одновременно с одним и тем же приоритетом (существует ограничение на размер стека для каждая очередь), там для него сказано "OverCommit", что означает, что вы перехватили очередь (в вашем случае очередь "По умолчанию-QOS" ), и она завершается, так как она не может получить больше задач в это время и выполнить их на моде вы хотите.

Решение:

вам нужно сначала найти команду "dispatch_async", которая вызывает этот сбой, а затем использовать одну из других очередей (это означает ожидание более медленного ответа, ожидаемого для этой задачи),

Обычно разработчик не думает об этом и просто использует основную очередь, которая является приоритетом/очередью по умолчанию следующим образом:

dispatch_async(dispatch_get_main_queue()) {
    // some task to perform
    print("This is my task")
}

чтобы исправить это (если приложение уведомит вас о том, что вы перегрузили основную очередь), необходимо изменить его на одну из других очередей, например:

let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
    // some task to perform
    print("This is my task")
})

если вам не требуется фоновое (или параллельное) выполнение, вы можете вообще игнорировать команду dispatch_async и просто выполнять команды вроде этого:

// some task to perform
print("This is my task")

Ответ 2

Перепишите ответ Shaybc в Swift 3:

    DispatchQueue.global(qos: .background).async {
      // some task to perform
      print("This is my task")
    })

Ответ 3

Для использования swift3

DispatchQueue.global(qos: DispatchQoS.QoSClass.background).async { 
... 
}