2017-06-05 4 views
2

私は他のプログラミング言語で多くの経験を持っていますが、それほど多くはありません。私はポーリングループを行いたいと思います。これは私が書いたものです:これは私のために正常に動作迅速なポーリングを行う適切な方法はありますか?

DispatchQueue.global(qos: .userInitiated).async { 
      [unowned self] in 
      while self.isRunning { 
       WebService.getPeople(completion: nil) 
       sleep(100) 
      } 
     } 

、100秒ごとに、私はポーリングを行い、その後、このスレッドの睡眠を作ります。私が疑問に思っているのは、迅速な3でこれを行う正しい方法ですか?あなたは2つのオプションがあり

+1

まず、できない場合はしないでください。しかし、必要があれば、単にタイマーを使用してください。 – Paulw11

+1

原則として、ディスパッチスレッドを避けることができれば、それを長時間ブロックしないでください。 – JeremyP

+0

@JeremyP他の人が同じことを言っていると聞いたことがありますが、私はなぜそれを突き止めないのですか?低優先度のバックグラウンドスレッドをディスパッチすると、その原因は何ですか? – MegaManX

答えて

3

  • 使用NSTimer
  • NSTimerを使用しDispatchSourceTimer

を使用することは非常に簡単ですが、それはアクティブ実行ループを必要とするので、あなたは上のポーリングする必要がある場合スレッドを作成して実行ループを維持する必要があるため(おそらくタイマー自体が実行ループを生き残ります)、バックグラウンドスレッドは少し難しいかもしれません。一方、queuesを使用すると、
DispatchSourceTimerが機能します。システム提供のキューの1つからディスパッチ・ソース・タイマーを簡単に作成することも、作成することもできます。

var timer: DispatchSourceTimer? 
    let queue = DispatchQueue.global(qos: .background) 
    guard let timer = DispatchSource.makeTimerSource(queue: queue) else { return } 
    timer.scheduleRepeating(deadline: .now(), interval: .seconds(100), leeway: .seconds(1)) 
    timer.setEventHandler(handler: { 
     // Your code 
    }) 
    timer.resume() 

leewayの引数は、システムがタイマーを延期できる時間の量です。

関連する問題