2016-01-03 1 views
0

Я делаю приложение в swift 2, где есть два таймера. Через 10 секунд я хотел бы, чтобы еще один таймер пошел быстрее. Я пытался делать это так, но это не работает (я пытаюсь изменить вар time к 1):Как изменить NSTimeInterval NSTimer через X секунд?

@IBOutlet var displayTimeLabel: UILabel! 
var startTimer = NSTimeInterval() 
var timer = NSTimer() 
var timer2:NSTimer = NSTimer()  
var time = 2.0 
@IBAction func Start(sender: UIButton) { 
    if !timer2.valid { 
     timer2 = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: "updateTime", userInfo: nil, repeats: true) 
     startTimer = NSDate.timeIntervalSinceReferenceDate() 
    } 
    timer = NSTimer.scheduledTimerWithTimeInterval(time, target: self, selector: "timer:", userInfo: nil, repeats: true) 
} 
func timer(timer: NSTimer){ 
//code 
} 
func updateTime() {   
    if displayTimeLabel.text >= "00:10.00"{ 
    print("00:10.00") //works 
    time = 1 // trying to execute code after 10 seconds(doesn't work) 
    } 
    let currentTime = NSDate.timeIntervalSinceReferenceDate() 
    var elapsedTime: NSTimeInterval = currentTime - startTimer 
    let minutes = UInt8(elapsedTime/60.0) 
    elapsedTime -= (NSTimeInterval(minutes) * 60) 
    let seconds = UInt8(elapsedTime) 
    elapsedTime -= NSTimeInterval(seconds) 
    let fraction = UInt8(elapsedTime * 100) 
    let strMinutes = String(format: "%02d", minutes) 
    let strSeconds = String(format: "%02d", seconds) 
    let strFraction = String(format: "%02d", fraction) 
    displayTimeLabel.text = "\(strMinutes):\(strSeconds).\(strFraction)" 
} 

Если я пишу печать (время) в func timer, через десять секунд он будет печатать 1 вместо 2, но он будет повторяться каждые две секунды. Пожалуйста помоги. Чтобы быть ясным, я хочу иметь возможность менять time на 1 вместо 2 после десяти секунд. Я также не хочу отменять таймеры. Таймеры также находятся на repeat = true. Спасибо заранее ... Антон

+0

Откуда Вы знаете 'time = 1' не работает? Что должно быть, это не так? –

+0

@ Умная ошибка Код в таймере func не повторяется каждые 1 секунду, а вместо этого каждые две секунды. –

+0

@ Умная ошибка Если я напишу печать (время) в таймере func, через десять секунд она выведет 1 вместо 2, но будет повторяться каждые две секунды. –

ответ

3

Несколько вещей.

Во-первых, вы не можете изменить временной интервал повторяющегося NSTimer - вам необходимо аннулировать первый таймер и назначить новый для нового интервала.

Второй а> = сравнение по строке не будет работать для того, чего вы пытаетесь достичь.

Наконец, вы попали в ту же самую плохую привычку, что и многие программисты Swift, и инициализировали свои таймерные переменные без необходимости, чтобы впоследствии отбросить эти таймеры. Вы должны использовать либо опциональную, либо неявно развернутую опцию

@IBOutlet var displayTimeLabel: UILabel! 
var startTime:NSDate? 
var timer : NSTimer? 
var timer2: NSTimer? 
var time = 2.0 

@IBAction func Start(sender: UIButton) { 
    if (self.timer2 == nil) { 
     self.time=2.0 
     self.timer2 = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: "updateTime", userInfo: nil, repeats: true) 
     self.startTime = NSDate() 
     self.timer = NSTimer.scheduledTimerWithTimeInterval(time, target: self, selector: "timer:", userInfo: nil, repeats: true) 
    } 
} 

func timer(timer: NSTimer){ 
//code 
} 
func updateTime() {   
    let currentTime = NSDate.timeIntervalSinceNow() 
    var elapsedTime = -self.startTime!.timeIntervalSinceNow() 
    if (elapsedTime >10.0 && self.time==2.0) { 
     timer.invalidate() 
     self.time=1.0 
     self.timer = NSTimer.scheduledTimerWithTimeInterval(time, target: self, selector: "timer:", userInfo: nil, repeats: true) 
    } 

    let minutes = UInt8(elapsedTime/60.0) 
    elapsedTime -= (NSTimeInterval(minutes) * 60) 
    let seconds = UInt8(elapsedTime) 
    elapsedTime -= NSTimeInterval(seconds) 
    let fraction = UInt8(elapsedTime * 100) 
    displayTimeLabel.text = String(format: "%02d:%02d.%02d", minutes,seconds,fraction) 
} 
+0

Какая разница между тем, что у меня есть сейчас относительно переменных и вашего кода (что делает переменные необязательными)? Изменяет ли производительность приложение? –

+0

Возможно, есть улучшение производительности, но это скорее вопрос стиля - вы создаете NSTimer (который не запланирован или не настроен), чтобы удовлетворить требование Swift о том, что необязательные переменные инициализированы, но вы просто собираетесь бросить этот таймер прочь позже. Если переменная на самом деле не будет инициализирована до конца, лучше использовать опцию, чтобы убедиться, что ваш код обрабатывает это правильно. Опционы в Swift позволяют избежать целого класса ошибок, связанных с использованием инициализированных переменных; инициализируя их так, как вы были подрывают все это преимущество – Paulw11

2

Просто установка time = 1 не изменит timer.

timeInterval таймера не может быть изменен. Ваши единственные варианты - создать новый таймер или запустить его с timeInterval из 1 и просто ничего не делать в любое другое время. timer() вызывается до тех пор, пока не пройдет 10 секунд.