2013-11-15 3 views
0

У меня есть приложение, в котором пользователь может инициировать обновление, и я хочу правильно строить вещи, чтобы обращаться с такими вещами, как приложение, выключение, телефонный звонок, кнопка дома и т. Д. Если пользователь нажимает кнопка home в середине процесса теперь, когда они снова открывают приложение, оно продолжает идти. Я не уверен, что хочу этого. Я бы хотел, чтобы кнопка «домой» убила этот процесс и заставила их начать все, когда они снова открываются. Какой лучший способ остановить то, что вы делаете, чтобы говорить (я понимаю, мне нужно использовать didenterbackground и обратный). Этот процесс должен быть в фоновом потоке, чтобы я мог NSThread отменить? Ive читал о периодической проверке флага, но как я могу остановиться, когда обнаруживаю условие? Мне было любопытно, и я уверен, что это просто, но лучший способ - просто прекратить выполнение чего-то.Остановить выполнение процесса, когда приложение закрыто

ответ

1

От 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]; 
    } 
} 
+0

Большое спасибо за ответ. Я видел это в другом месте, но это немного смутило меня, и мне было интересно, не могу ли я сделать что-то подобное. мне кажется, что я должен избегать отмены потока и использовать механизм проверки флажка bool периодически, но если у меня есть чек, и я определяю, что действие нужно остановить, возврат останавливает все, но как это влияет на сам поток? как общий вопрос, если ничего не работает или не доходит до конца кода, будет ли поток закрываться сам? – skinsfan00atg

0

Создать NSOperationQueue. Для всех ваших длительных задач создайте объекты NSOperation, поместите их на NSOperationQueue. Вы можете определить, когда приложение идет в фоновом режиме, используя метод делегата applicationWillResignActive или уведомление UIApplicationWillResignActiveNotification.

Когда вы обнаруживаете переход состояния, просто вызовите методвашей очереди. В очереди есть свойство suspended, если вы хотите просто приостановить его. (И вы можете возобновить его позже.)

NSOperationQueue - фантастическая технология. Гораздо более высокий уровень, чем GCD. Учите это, любите!

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