2016-12-09 8 views
0

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

Вот мой код до сих пор:

class Neversleep { 
    private static var callback : (()->Void)? 
    private static var thread: NSThread? 

    static func start(callback:()->Void) { 
     self.callback = callback 

     Neversleep.thread = NSThread(target: self, selector: #selector(Neversleep.task), object: nil) 
     Neversleep.thread?.start() 

    } 

    static func stop() { 
     print("NEVERSLEEP:STOP") 
     Neversleep.thread?.cancel() 

    } 

    @objc static func task() { 

     while (true) 
     { 
      sleep(3); 
      print("we are still running!") 
      callback?() 
     } 
    } 
} 

Я называю Neversleep.start() из метода DidEnterBackground приложение делегата.

Я вызываю Neversleep.stop() из willEnterForeground ... но это не останавливает поток.

Уверен, что мне не хватает чего-то очевидного здесь. Но что?

ответ

1

Вызов cancel по нити не автоматически убивает нить. Фактическое тело потока должно остановить все, что он делает, когда его поток отменяется.

Обновление вашей task функции, как это:

@objc static func task() { 
    while (!NSThread.currentThread.cancelled) 
    { 
     sleep(3); 
     print("we are still running!") 
     callback?() 
    } 
} 

Дважды проверьте фактический метод и свойств имена currentThread и cancelled. Я не на 100% уверен, что они названы в Swift 2.

Даже при вышесказанном вы, скорее всего, получите еще один звонок callback после того, как нить отменена из-за sleep. Вы можете исправить это:

@objc static func task() { 
    while (!NSThread.currentThread.cancelled) 
    { 
     sleep(3); 
     print("we are still running!") 
     if (!NSThread.currentThread.cancelled) { 
      callback?() 
     } 
    } 
} 
+0

Это работало как шарм. Огромное спасибо. – bflora2

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

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