我知道之前已经提出这个问题,但不幸的是,这些答案都没有对我有所帮助。我有一个应用程序,在不同的线程中执行一堆短的后台任务。代码主要是在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可能存在错误。
有什么想法吗?