2016-10-25 22 views
0

私はこのコードを持っている:スレッドクラスを使用して自己をキャプチャする必要がありますか?

myThreadTemp = Thread(target: self, selector: #selector(threadMain), object: nil) 

@objc func threadMain(data: AnyObject) { 
     let runloop = RunLoop.current 
     runloop.add(NSMachPort(), forMode: RunLoopMode.defaultRunLoopMode) 
     while !Thread.current.isCancelled{ 
       //foreground 
       DispatchQueue.main.async {[weak self] in 

       self?.somemethod() 
       self?.somevar = 1 
        print("tick") 
       } 
      if Thread.current.isCancelled { 

      } 
      Thread.sleep(forTimeInterval: 1.0) 
     } 
     runloop.run(mode: RunLoopMode.defaultRunLoopMode, before: NSDate.distantFuture) 

    } 

または私はちょうどこれを行うことができます。

DispatchQueue.main.async { 
       self.somemethod() 
       self.somevar = 1 
        print("tick") 
       } 

を私はこれを見た:

Shall we always use [unowned self] inside closure in Swift

をしかし@objc funcが使用されている場合でしたか?

答えて

1

第1の例では、ティックの間に1秒待っている間、無期限にrunloopを回転させるように見えますが、2番目の例は非常に次の実行ループの繰り返しで1回実行されます。第2のケースでは、実際には1回だけ実行され、その後にブロックが解放される(自己とブロックの間に存在する一時的な保持ループを解除する)ため、自己管理の問題はありません。

あなたは(私はあなたの質問に基づいて推測していたように)すべての1秒をチェックしようとしていると仮定すると、あなたがやろうとしているものを行うには良い方法があり、using a timer:あなたのよう

// Must be executed on main thread, or other NSRunLoop enabled thread, 
// or the below code will silently do nothing. 
self.timer = Timer(timeInterval: 1.0, repeats: true) { [weak self] _ in 
    self?.someMethod() 
    self?.someVar = 1 
    print("tick") 
} 

// Somewhere in the future, to stop the timer: 
// self.timer.invalidate() 

上の例では、タイマーの大文字と小文字のどちらかを参照したいと思うかもしれません(タイマーブロックはselfとタイマーのselfを強く参照します)。ブロックはタイマーを無効にする際に解放されるべきです。この場合でも弱い参照は100%必要ではありません。

関連する問題