所以這個網頁上有關於後臺執行的例子:https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH4-SW1,這裏是例子:蘋果編程指南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) [[UIApplication sharedApplication] endBackgroundTask:_bgTask]; WEAK_SELF weakSelf = self; _bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^ {[UIApplication sharedApplication] endBackgroundTask:weakSelf.bgTask]; weakSelf.bgTask = UIBackgroundTaskInvalid; }]; –