2016-12-09 25 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?() 
     } 
    } 
} 

私はアプリデリゲートのDidEnterBackgroundメソッドからNeversleep.start()を呼び出します。

willEnterForegroundからNeversleep.stop()を呼び出していますが、スレッドを停止していません。

私は確信しています。しかし何?

答えて

1

スレッドでcancelを呼び出すことによってスレッドが自動的に削除されるわけではありません。スレッドの実際のボディは、スレッドがキャンセルされたときに何をしているのかを停止する必要があります。このような

更新しますtask機能:

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

ダブルcurrentThreadcancelledのために実際のメソッドとプロパティ名を確認してください。スウィフト2の名前は100%ではありません。

sleepのためにスレッドがキャンセルされた後、callbackにもう一度呼び出される可能性があります。これを修正するには、

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

魅力的なように機能しました。どうもありがとうございます。 – bflora2

関連する問題