2016-04-06 2 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. Это создает экземпляр и не может быть повторно создан в одном application instance. Оттуда [Grand Central Dispatch][1] используется для борьбы с таймером и аспектом резьбы.

+0

Не могли бы вы объяснить, как это работает? Я запутался, как вы можете создать глобальный таймер внутри глобального таймера класса. – Jared

+0

. Я обновляю свой ответ ... –

+0

Можете ли вы обновить это для быстрого 3, он почему-то не может найти sharedTimer –

0

Прочитайте ссылку NSTimer для создания таймера.

Глобальная переменная является глобальной переменной. Он остается навсегда. Обычно вы не будете создавать только глобальную переменную, но скрыть все функциональные возможности одного класса.

Обычно было бы неплохо сказать, чего вы на самом деле хотите достичь, вместо того, чтобы сказать то, что, по вашему мнению, вам нужно для его достижения.

+0

Итак, если я поместил NSTimer() в быстрый файл вне класса и запустил его, я могу получить к нему доступ из любого файла, и он будет тем же самым экземпляром? – Jared

+0

Переход на глобальную переменную маршрут работал отлично, спасибо за предложение. –

3

Для тех, кто нуждается в версии Swift 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() вызывается дважды и ничего не делает, когда вызывается stopTimer() и таймера не существует.

Смежные вопросы