2014-11-18 1 views
1

Я хочу показать экран заставки, когда приложение останется в фоновом режиме более 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]; 
    }); 
} 
} 

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

- (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]; 
     }]; 
} 

, а затем удалить этот файл из окна, когда Application Введите передний план снова

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

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

ответ

1

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

  • фон Fetch/обновить
  • Remote Notification
  • (я не помню третья. Возможно ли загрузить фоновое изображение?)

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

 Смежные вопросы

  • Нет связанных вопросов^_^