Не удается завершитьBackgroundTask: фоновая задача с идентификатором 1 не существует или, возможно, она уже завершена

Я знаю, что об этом уже спрашивали, но, к сожалению, ни один из этих ответов не помог мне. У меня есть приложение, которое выполняет кучу коротких фоновых задач в разных потоках. Код в основном написан на 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 может быть ошибка.

Есть идеи?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]