2016-04-06 11 views
1

私が作成しているアプリのために、アプリケーションの任意のファイルがいつでも起動し停止できるバックグラウンドでタイマーを実行したいと考えています。グローバルタイマーをバックグラウンドで実行することはできますか?

これが可能かどうか、これを実装するにはどうすればいいですか?

私はグローバル変数(これはビューコントローラ間で持続するかどうかわかりませんが)またはNSNotificationsで何かを行うかどうかを考えていましたか?

+0

あなたはTimerクラスを作成することができます...あなたを見せたいですか? –

+0

あなたが私に見せることができればそれは素晴らしいだろう – Jared

+0

あなたがしようとしていることは、おそらくもっと良い方法があります。 – nhgrif

答えて

3

あなたがそのすなわちような何かが必要な場合は、どこからでもアクセスできます。

例:

class MyGlobalTimer: NSObject { 

    let sharedTimer: MyGlobalTimer = MyGlobalTimer() 
    var internalTimer: NSTimer? 

    func startTimer(){ 
     guard self.internalTimer != nil else { 
      fatalError("Timer already intialized, how did we get here with a singleton?!") 
     } 
     self.internalTimer = NSTimer.scheduledTimerWithTimeInterval(1.0 /*seconds*/, target: self, selector: #selector(fireTimerAction), userInfo: nil, repeats: true) 
    } 

    func stopTimer(){ 
     guard self.internalTimer != nil else { 
      fatalError("No timer active, start the timer before you stop it.") 
     } 
     self.internalTimer?.invalidate() 
    } 

    func fireTimerAction(sender: AnyObject?){ 
     debugPrint("Timer Fired! \(sender)") 
    } 

} 

それはラフだ、と多くの作業が必要ですが、私が思い付いた何のためにその機能1分の間隔で。あなたはの効果に何かをしたいタイマーにアクセスするには

MyGlobalTimer.sharedTimer.startTimer() 
    MyGlobalTimer.sharedTimer.stopTimer() 
    let firedCounter = MyGlobalTimer.sharedTimer.numberOfTimesFired 

編集この仕組み

は次のとおりです。

MyGlobalTimerクラスがインスタンス化されsingleton classですMyGlobalTimer.sharedTimerに電話してください。これはインスタンス化され、1つのインスタンスで再度インスタンス化することはできませんapplication instance。そこから、[Grand Central Dispatch][1]は、物事のタイマーとスレッドの側面に対処するために使用されます。スウィフト3バージョンを必要とする人のため

+0

これはどのように機能するのですか?私はあなたがクラスのグローバルタイマーの内部でグローバルタイマーをインスタンス化する方法を混乱させる – Jared

+0

私の答えを更新します... –

+0

これをswift 3で更新することはできますか何かの理由でsharedTimerを今見つけることができません –

0

タイマーを構築するためのNSTimerリファレンスをお読みください。

グローバル変数はグローバル変数です。それは永遠に続く。通常、グローバル変数だけを作成するのではなく、シングルトンクラスのすべての機能を隠すことになります。

通常、達成する必要があると考えるのではなく、実際に達成したいことを言うことをお勧めします。

+0

NSTimer()をクラス外の素早いファイルに入れて起動すると、どのファイルからでもアクセスでき、同じインスタンスになりますか? – Jared

+0

グローバル変数のルートが完璧に機能しました。ありがとうございました。 –

3

class TimerModel: NSObject { 
    static let sharedTimer: TimerModel = { 
     let timer = TimerModel() 
     return timer 
    }() 

    var internalTimer: Timer? 
    var jobs = [() -> Void]() 

    func startTimer(withInterval interval: Double, andJob job: @escaping() -> Void) { 
     if internalTimer == nil { 
      internalTimer?.invalidate() 
     } 
     jobs.append(job) 
     internalTimer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(doJob), userInfo: nil, repeats: true) 
    } 

    func pauseTimer() { 
     guard internalTimer != nil else { 
      print("No timer active, start the timer before you stop it.") 
      return 
     } 
     internalTimer?.invalidate() 
    } 

    func stopTimer() { 
     guard internalTimer != nil else { 
      print("No timer active, start the timer before you stop it.") 
      return 
     } 
     jobs = [()->()]() 
     internalTimer?.invalidate() 
    } 

    func doJob() { 
     for job in jobs { 
      job() 
     } 
    } 

} 

は、私は自分のニーズに合わせていくつかの変更を加えました。後でアクションを追加できるように、jobsの配列を追加しました。そして、私はそれらのfatalError呼び出しを削除しました。代わりに、startTimer()が2回呼び出されたときにタイマーが再起動し、stopTimer()が呼び出され、タイマーが存在しない場合は何も行いません。

関連する問題