У меня есть приложение, в котором пользователь может инициировать обновление, и я хочу правильно строить вещи, чтобы обращаться с такими вещами, как приложение, выключение, телефонный звонок, кнопка дома и т. Д. Если пользователь нажимает кнопка home в середине процесса теперь, когда они снова открывают приложение, оно продолжает идти. Я не уверен, что хочу этого. Я бы хотел, чтобы кнопка «домой» убила этот процесс и заставила их начать все, когда они снова открываются. Какой лучший способ остановить то, что вы делаете, чтобы говорить (я понимаю, мне нужно использовать didenterbackground и обратный). Этот процесс должен быть в фоновом потоке, чтобы я мог NSThread отменить? Ive читал о периодической проверке флага, но как я могу остановиться, когда обнаруживаю условие? Мне было любопытно, и я уверен, что это просто, но лучший способ - просто прекратить выполнение чего-то.Остановить выполнение процесса, когда приложение закрыто
ответ
От Thread Programming Guide компании Apple (управления потоками -> Нагрузочного нити):
Хотя какао, POSIX, многопроцессорные Services предлагают процедуры для убийства темы непосредственно, использование таких процедур настоятельно не рекомендуется. Убийство нити предотвращает очистку нити после себя. Память, выделенная потоком, потенциально может быть просочилась, а любые другие ресурсы, используемые в настоящее время в потоке, могут быть не очищены должным образом, создавая потенциальные проблемы позже.
Если вы ожидаете, что нужно прекратить поток в середине операции, вы должны спроектировать свои потоки с самого начала, чтобы ответить на сообщение об отмене или выходе. Для длительных операций это может означать периодическую остановку работы и проверку того, прибыло ли такое сообщение. Если приходит сообщение о том, что поток завершается, поток будет иметь возможность выполнить любую необходимую очистку и выйти изящно; в противном случае он мог бы просто вернуться к работе и обработать следующий фрагмент данных.
И есть также пример кода, как это сделать:
- (void)threadMainRoutine
{
BOOL moreWorkToDo = YES;
BOOL exitNow = NO;
NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
// Add the exitNow BOOL to the thread dictionary.
NSMutableDictionary* threadDict = [[NSThread currentThread] threadDictionary];
[threadDict setValue:[NSNumber numberWithBool:exitNow] forKey:@"ThreadShouldExitNow"];
// Install an input source.
[self myInstallCustomInputSource];
while (moreWorkToDo && !exitNow)
{
// Do one chunk of a larger body of work here.
// Change the value of the moreWorkToDo Boolean when done.
// Run the run loop but timeout immediately if the input source isn't waiting to fire.
[runLoop runUntilDate:[NSDate date]];
// Check to see if an input source handler changed the exitNow value.
exitNow = [[threadDict valueForKey:@"ThreadShouldExitNow"] boolValue];
}
}
Создать NSOperationQueue
. Для всех ваших длительных задач создайте объекты NSOperation
, поместите их на NSOperationQueue
. Вы можете определить, когда приложение идет в фоновом режиме, используя метод делегата applicationWillResignActive
или уведомление UIApplicationWillResignActiveNotification
.
Когда вы обнаруживаете переход состояния, просто вызовите методвашей очереди. В очереди есть свойство suspended
, если вы хотите просто приостановить его. (И вы можете возобновить его позже.)
NSOperationQueue - фантастическая технология. Гораздо более высокий уровень, чем GCD. Учите это, любите!
- 1. Остановить службу, когда приложение закрыто
- 2. Как остановить воспроизведение MediaPlayer, когда приложение закрыто?
- 3. остановить выполнение процесса для miliseconds
- 4. UILocalNotification когда приложение закрыто
- 5. startMonitoringForRegion, когда приложение закрыто
- 6. радиоприемник, когда приложение закрыто
- 7. сигнализации, когда приложение закрыто
- 8. обнаружить, когда приложение закрыто
- 9. Push Notification Когда приложение закрыто/закрыто, включая
- 10. Как остановить AdMob с помощью процессора, когда приложение Android закрыто?
- 11. Как остановить звук MediaPlayer, когда приложение закрыто/сведено к минимуму?
- 12. Как остановить обслуживание службы, когда приложение Android закрыто
- 13. Приложение запускает новую услугу, когда приложение закрыто
- 14. Выполнение javascript-кода от службы android, когда приложение закрыто
- 15. Stop AlarmManager, когда приложение случайно закрыто
- 16. Остановить воспроизведение видео Youtube Когда закрыто лайтбокс
- 17. iBeacon Notification Когда приложение закрыто
- 18. Время, когда приложение было закрыто
- 19. NSURLCache опорожняется, когда приложение закрыто
- 20. отменить AlarmManager, когда приложение закрыто
- 21. Swift2 push, когда приложение закрыто
- 22. Pushing уведомления, когда приложение закрыто
- 23. Сохранить параметры, когда приложение закрыто
- 24. Сообщение, когда приложение Android закрыто
- 25. sharedpreferences остается, когда приложение закрыто
- 26. Quickblox Push, когда приложение закрыто
- 27. Обновление местоположения, когда приложение закрыто
- 28. Уведомления Firebase, когда приложение закрыто
- 29. Расположение Мониторинг когда приложение закрыто
- 30. Сервис прекращается, когда приложение закрыто.
Большое спасибо за ответ. Я видел это в другом месте, но это немного смутило меня, и мне было интересно, не могу ли я сделать что-то подобное. мне кажется, что я должен избегать отмены потока и использовать механизм проверки флажка bool периодически, но если у меня есть чек, и я определяю, что действие нужно остановить, возврат останавливает все, но как это влияет на сам поток? как общий вопрос, если ничего не работает или не доходит до конца кода, будет ли поток закрываться сам? – skinsfan00atg