Обновите пользовательский интерфейс из фонового потока, когда приложение также находится в фоновом режиме, чтобы отображать заставку при следующем возобновлении.

Я хочу показать заставку, когда приложение остается в фоновом режиме более 3 минут. Я запустил фоновый таймер, чтобы запустить функцию, которая будет обрабатывать обновление пользовательского интерфейса.

- (void)applicationDidEnterBackground:(UIApplication *)
if (application.applicationState == UIApplicationStateBackground) {
    UIBackgroundTaskIdentifier bgTask = UIBackgroundTaskInvalid;
    UIApplication *app = [UIApplication sharedApplication];
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
    }];
    //and create new timer with async call:
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        splashTimer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(timerFired) userInfo:nil repeats:NO];
        [[NSRunLoop currentRunLoop] addTimer:splashTimer forMode:NSDefaultRunLoopMode];
        [[NSRunLoop currentRunLoop] run];
    });
}
}

Теперь, когда вызывается таймер, я вызываю функцию для обновления моего пользовательского интерфейса, то есть добавляю изображение в окно, чтобы оно выглядело так, как будто это экран-заставка.

  - (void)timerFired
    {
      [splashTimer invalidate];
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            UIImageView *splash = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Splash_Screen.png"]];
            splash.frame = self.window.bounds;
            [self.window addSubview:splash];
        }];
}

а затем удалите это изображение из окна, когда приложение снова выйдет на передний план

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    if ([[self.window subviews] count] > 1) {
        [NSThread sleepForTimeInterval:1.0];
        [[[self.window subviews] lastObject] removeFromSuperview];
    }
}

но мой экран-заставка не отображается, когда я вызываю его из фонового потока. Я пробовал все, но не повезло. Моя проблема в том, что My Timer вызывается из фонового потока, и если я хочу добавить изображение из этого потока, пользовательский интерфейс не обновляется. Любая помощь?


person waseemwk    schedule 18.11.2014    source источник


Ответы (1)


Springboard не обновляет снимок вашего приложения[1], когда срок действия всех фоновых задач истек/завершен. IIRC, когда ваше приложение находится в фоновом режиме, моментальный снимок обновляется только непосредственно перед тем, как ваше приложение будет приостановлено после обработки этих фоновых событий:

  • Фоновая выборка/обновление
  • Удаленное уведомление
  • (Я не помню третий. Может быть, фоновая загрузка?)

[1] Изображение, которое появляется в переключателе задач, когда ваше приложение возвращается на передний план.

person Dex    schedule 18.11.2014