2014-01-21 4 views
0

beginBackgroundTaskWithExpirationHandler создает новый поток, когда мы что-то выполняем.beginBackgroundTaskWithExpirationHandler с текущим потоком

Могу ли я выполнить что-то, используя существующий поток с этим?

Поскольку новый поток, созданный beginBackgroundTaskWithExpirationHandler, вызывает некоторые проблемы для моего приложения, когда он возобновляется. Поэтому я передал экземпляр существующего потока в beginBackgroundTaskWithExpirationHandler и вызвал необходимые методы с использованием существующего потока. Можно ли использовать существующие потоки внутри beginBackgroundTaskWithExpirationHandler?

Не может быть никаких проблем?

- (void)applicationDidEnterBackground:(UIApplication *)application { 
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 
IOSMobilePOSApplication *app = [IOSMobilePOSApplication getInstance]; 
if ([app keepAliveMessage]) { 
    if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) 
    { 
     [Logger log:@"Multitasking Supported"]; 

     background_task = [application beginBackgroundTaskWithExpirationHandler:^ { 
      [Logger log:@"Background maximum time exeeded."]; 
      IOSMobilePOSApplication *iosMobileApplication = [IOSMobilePOSApplication getInstance]; 
      [[iosMobileApplication getKeepAliveManager] stop]; 
      //Clean up code. Tell the system that we are done. 
      [application endBackgroundTask: background_task]; 
      background_task = UIBackgroundTaskInvalid; 
     }]; 

     //To make the code block asynchronous 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

      //### background task starts 
      [Logger log:@"Running in the background"]; 

      IOSMobilePOSApplication *iosMobileApplication = [IOSMobilePOSApplication getInstance]; 
      [[iosMobileApplication getKeepAliveManager] setEnabled:true]; 
      [[iosMobileApplication getKeepAliveManager] performSelector:@selector(run) onThread:[[iosMobileApplication getKeepAliveManager] runingThread] withObject:NULL waitUntilDone:NO]; 
      isStarted = true; 
      //#### background task ends 

      //Clean up code. Tell the system that we are done. 
      [application endBackgroundTask: background_task]; 
      background_task = UIBackgroundTaskInvalid; 
     }); 
    } 
    else 
    { 
     [Logger log:@"Multitasking Not Supported"]; 
    } 
} 

}


здесь
[[iosMobileApplication getKeepAliveManager] run]; вызывает новый поток для запуска и это вызывает проблемы синхронизации потоков в моем коде. Поэтому я добавил код вместо вышеупомянутой строки.

[[iosMobileApplication getKeepAliveManager] performSelector:@selector(run) onThread:[[iosMobileApplication getKeepAliveManager] runingThread] withObject:NULL waitUntilDone:NO];. 

Неполадки при возникновении проблем при приеме приложения?

ответ

0

Это, наверное, некоторая ошибка, потому что -beginBackgroundTaskWithExpirationHandler: не создает нити. Это знаменует собой начало какой-то долговременной задачи, которую вы собираетесь начать или просто начать.

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

+0

Я отредактировал мое сообщение. [[iosMobileApplication getKeepAliveManager] run]; вызывает новый поток. – deltaaruna

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