Я провел некоторое исследование на beginBackgroundTaskWithExpirationHandler и не думаю, что правильно понимаю. У меня сложилось впечатление, что я могу завернуть в него длинную задачу, если наше приложение переходит в фоновый режим, и эта задача продолжает выполняться. Поэтому при первом запуске нашего приложения вы можете загрузить больше данных с нашего сервера, который предоставляет пользователю больше информации. Поскольку это может занять некоторое время, я хочу, чтобы эта задача выполнялась в фоновом режиме и в спящем режиме (если это возможно).
Моя оригинальная функция без beginBackgroundTaskWithExpirationHandler, которая вызывается при нажатии пользователем на загрузку, выглядит следующим образом:
-(void) HandleDownload:(NSNotification *)notification
{
DataManager *dmgr = [TestApp sharedDelegate].AppDataManager;
NSString *nextPacketName = [dmgr GetNextPacketName];
int totalNumberPackets = [dmgr GetRowCountForTable:@"Manifest"];
if (nextPacketName == nil)
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:DownloadReferenceSequenceNotification object:nil];
self.ProgressLabel.hidden = YES;
self.ProgressBar.hidden = YES;
}
else
{
self.ProgressLabel.hidden = NO;
self.ProgressLabel.text = [NSString stringWithFormat:@"Downloading %@", nextPacketName];
self.ProgressBar.hidden = NO;
self.ProgressBar.progress += 1. / (totalNumberPackets);
WebServiceManager *wmgr = [WebServiceManager sharedInstance];
[wmgr GetPacket:nextPacketName]; // This function creates the NSURL and starts the request
}
}
Эта функция работает, если приложение находится на переднем плане. То, что я пытался сделать, чтобы эта задача находилась в фоновом режиме:
-(void) HandleDownload:(NSNotification *)notification
{
UIApplication *app = [UIApplication sharedApplication];
__block UIBackgroundTaskIdentifier taskID;
taskID = [app beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"Background task not completed");
[app endBackgroundTask:taskID];
DataManager *dmgr = [TestApp sharedDelegate].AppDataManager;
NSString *nextPacketName = [dmgr GetNextPacketName];
int totalNumberPackets = [dmgr GetRowCountForTable:@"Manifest"];
if (nextPacketName == nil)
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:DownloadReferenceSequenceNotification object:nil];
self.ProgressLabel.hidden = YES;
self.ProgressBar.hidden = YES;
}
else
{
self.ProgressLabel.hidden = NO;
self.ProgressLabel.text = [NSString stringWithFormat:@"Downloading %@", nextPacketName];
self.ProgressBar.hidden = NO;
self.ProgressBar.progress += 1. / (totalNumberPackets);
WebServiceManager *wmgr = [WebServiceManager sharedInstance];
[wmgr GetPacket:nextPacketName]; // This function creates the NSURL and starts the request
}
NSLog(@"Time remaining: %f", app.backgroundTimeRemaining);
}];
if (taskID == UIBackgroundTaskInvalid) {
NSLog(@"Failed to create background task identifier");
}
}
Правильно ли я поступаю по этому поводу, пытаясь обернуть свою долгосрочную задачу в блоке beginBackgroundTaskWithExpirationHandler? Не похоже, что я, так как не вызывается ни один код в блоке expiratinHandler. Заранее спасибо!