У кого-нибудь был опыт диагностики этих сбоев? У меня есть один пользователь, получающий их последовательно, и хотя я нашел ссылку, связанную с iOS, мое приложение не сбой при одном и том же типе операции...
Постоянная очередь отправки: com.apple.root.default-qos.overcommit crash
Ответ 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 {
...
}