无法使用endBackgroundTask:标识符1不存在后台任务,或者它可能已经结束

时间:2016-03-16 08:04:18

标签: c++ ios multithreading uikit objective-c++

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

有什么想法吗?

0 个答案:

没有答案