beginBackgroundTaskWithExpirationHandler, загрузка данных с сервера - PullRequest
1 голос
/ 09 марта 2012

Я провел некоторое исследование на 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. Заранее спасибо!

1 Ответ

1 голос
/ 10 апреля 2012

Я только исследую эту же функцию, чтобы использовать ее в первый раз, но я вижу, что вам кажется, что вам не хватает сбалансированных вызовов endBackgroundTask: она у вас наверху в вашем обработчике срока действия, но она вызывается только еслиВы достигаете предела времени.Он должен быть добавлен в конце задачи, которую вы также пытаетесь выполнить.Там он будет вызван, если ваш процесс завершится до истечения срока действия.

-(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);
            [app endBackgroundTask:taskID];
}];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...