私が作成しているアプリのために、アプリケーションの任意のファイルがいつでも起動し停止できるバックグラウンドでタイマーを実行したいと考えています。グローバルタイマーをバックグラウンドで実行することはできますか?
これが可能かどうか、これを実装するにはどうすればいいですか?
私はグローバル変数(これはビューコントローラ間で持続するかどうかわかりませんが)またはNSNotificationsで何かを行うかどうかを考えていましたか?
私が作成しているアプリのために、アプリケーションの任意のファイルがいつでも起動し停止できるバックグラウンドでタイマーを実行したいと考えています。グローバルタイマーをバックグラウンドで実行することはできますか?
これが可能かどうか、これを実装するにはどうすればいいですか?
私はグローバル変数(これはビューコントローラ間で持続するかどうかわかりませんが)またはNSNotificationsで何かを行うかどうかを考えていましたか?
あなたがそのすなわちような何かが必要な場合は、どこからでもアクセスできます。
例:
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バージョンを必要とする人のため
これはどのように機能するのですか?私はあなたがクラスのグローバルタイマーの内部でグローバルタイマーをインスタンス化する方法を混乱させる – Jared
私の答えを更新します... –
これをswift 3で更新することはできますか何かの理由でsharedTimerを今見つけることができません –
タイマーを構築するためのNSTimerリファレンスをお読みください。
グローバル変数はグローバル変数です。それは永遠に続く。通常、グローバル変数だけを作成するのではなく、シングルトンクラスのすべての機能を隠すことになります。
通常、達成する必要があると考えるのではなく、実際に達成したいことを言うことをお勧めします。
NSTimer()をクラス外の素早いファイルに入れて起動すると、どのファイルからでもアクセスでき、同じインスタンスになりますか? – Jared
グローバル変数のルートが完璧に機能しました。ありがとうございました。 –
:
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()
が呼び出され、タイマーが存在しない場合は何も行いません。
あなたはTimerクラスを作成することができます...あなたを見せたいですか? –
あなたが私に見せることができればそれは素晴らしいだろう – Jared
あなたがしようとしていることは、おそらくもっと良い方法があります。 – nhgrif