Я знаю, что об этом уже спрашивали, но, к сожалению, ни один из этих ответов не помог мне. У меня есть приложение, которое выполняет кучу коротких фоновых задач в разных потоках. Код в основном написан на C ++, в него при необходимости добавляется ObjectiveC (поэтому код находится в файле .mm). Для выполнения фоновых задач у меня есть примерно следующий класс C ++ с конструктором и descrtuctor:
class BTask {
UIBackgroundTaskIdentifier taskIden;
public:
BTask(ExpirationHandler *h) {
taskIden = [[[UIApplication sharedApplication]
beginBackgroundTaskWithExpirationHandler:^ {
h->callback();
[[UIApplication sharedApplication] endBackgroundTask:taskIden];
taskIden = UIBackgroundTaskInvalid;
}];
}
~BTask() {
if (taskIden != UIBackgroundTaskInvalid)
[[UIApplication sharedApplication] endBackgroundTask:taskIden];
}
};
Теперь каждая из моих задач выполняется в своем собственном потоке и имеет следующую структуру:
void task(.....) {
BTask btask(...);
//.... do the work of the task
//.... destructor of BTask will call endBackgroundTask
}
Поэтому при запуске иногда я получаю эту ошибку при вызове endBackgroundTask (как в заголовке вопроса): не удается получить фоновую задачу: фоновая задача с идентификатором 1 не существует. Ошибка воспроизводится только изредка (1 в 3-4 раза) ) и в начале выполнения приложения (похоже, это первая задача, в которой возникла проблема), а проблемный идентификатор как-то всегда равен 1.
Мое приложение не объявляет никаких фоновых возможностей.
Я использую симулятор iPhone 6s plus, но могу воспроизвести проблему на другом симуляторе (iPhone 5s).
Код, который реализует класс BTask и сами задачи, находится в статической библиотеке, которая связана с приложением (не уверен, что это имеет значение).
Также обратите внимание, что в моем тестовом случае приложение всегда находится на переднем плане.
Кроме того, я проверил, что блок обработчика истечения никогда не вызывается (что понятно, поскольку приложение даже не переходит в фоновый режим).
Из ссылки на UIApplication кажется, что я делаю это правильно, и разрешено вызывать beginBackgroundTask … и endBackgroundTask одновременно из нескольких потоков для одновременного выполнения множества фоновых задач, если только beginBackgroundTask … и endBackgroundTask соединены с тот же идентификатор, который должен иметь место в моем коде.
Итак, до сих пор я понятия не имею, в чем может быть проблема, и даже склонен думать, что в UIKit может быть ошибка.
Есть идеи?
Задача ещё не решена.
Других решений пока нет …