Итак, на этой странице есть пример о выполнении фона: https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH4-SW1, вот пример:Руководство по программированию Apple для руководства по выполнению фона iOS?
- (void)applicationDidEnterBackground:(UIApplication *)application {
bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{
// Clean up any unfinished task business by marking where you
// stopped or ending the task outright.
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Do the work associated with the task, preferably in chunks.
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
});
}
Говорит, что bgTask
определяется в классе как переменные. Таким образом, для каждого экземпляра класса (объекта) существует одно свойство bgTask
. Если applicationDidEnterBackground
нужно было вызывать несколько раз, прежде чем асинхронный блок заканчивается, разве здесь нет опасности состояния гонки? Я имею в виду, что bgTask
изменит его значение, и endBackgroundTask
будет вызываться при новом значении задачи вместо старого значения?
Не здесь лучшее решение, чтобы сделать это:
__block UIBackgroundTaskIdentifier bgTask;
перед вызовом beginBackgroundTaskWithName
?
вы должны проверить, если bgTask не недействительным и закончить его, прежде чем присваивать ему новое значение. –
if (_bgTask! = UIBackgroundTaskInvalid) [[UAppication sharedApplication] endBackgroundTask: _bgTask]; WEAK_SELF weakSelf = self; _bgTask = [[UAppication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ [[UIApplication sharedApplication] endBackgroundTask: weakSelf.bgTask]; weakSelf.bgTask = UIBackgroundTaskInvalid; }]; –