Как сбросить NSTimer? быстрый код

Итак, я создаю приложение/игру, в которой вы нажимаете кнопку, соответствующую картинке, до того, как таймер истечет, и вы проиграете. У вас есть 1 секунда, чтобы нажать кнопку, и если вы выберете правильную кнопку, таймер сбрасывается и появляется новое изображение. У меня проблемы со сбросом таймера. Он срабатывает через одну секунду, даже после того, как я пытаюсь сбросить его. Вот код:

loadPicture() запускает viewDidLoad()

func loadPicture() {
    //check if repeat picture
    secondInt = randomInt
    randomInt = Int(arc4random_uniform(24))
    if secondInt != randomInt {
        pictureName = String(self.PicList[randomInt])
        image = UIImage(named: pictureName)
        self.picture.image = image
        timer.invalidate()
        resetTimer()

    }
    else{
        loadPicture()
    }
}

и вот метод resetTimer():

func resetTimer(){
        timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("gameOverTimer"), userInfo: nil, repeats: false)

}

Я думаю, это может иметь какое-то отношение к NSRunloops? Я не уверен. Честно говоря, я даже не знаю, что такое NSRunloop.


person LuKenneth    schedule 29.07.2015    source источник
comment
Я не уверен, почему ваш таймер срабатывает после того, как вы аннулируете его, но у вас есть ошибка в вашей рекурсии, которая проверяет наличие дубликатов. Вы перезаписываете randomInt, так что при рекурсивном вызове loadPicture вы эффективно проверяете, совпадает ли это случайное число с предыдущее случайное число, если это случайное число совпадает с предыдущим изображением, которое отображалось   -  person Paulw11    schedule 29.07.2015
comment
в loadPicture() перед строкой resetTimer() напишите timer = nil . . .   -  person iHart    schedule 29.07.2015
comment
Чтобы просто убедиться, вы создаете таймер в том же потоке? во-вторых, вы пытались увеличить время до 5 секунд?   -  person Shripada    schedule 29.07.2015
comment
Paulw11, Бага нет. randomInt представляет индекс изображения в массиве. Если int тот же, картинка тоже такая же.   -  person LuKenneth    schedule 29.07.2015
comment
iHart, это не сработало :(   -  person LuKenneth    schedule 29.07.2015
comment
ншеббар, да и да   -  person LuKenneth    schedule 29.07.2015


Ответы (1)


Так я наконец понял это...

Пришлось сделать отдельную функцию для запуска таймера путем его инициализации. И в функцию resetTimer() я добавил строку timer.invalidate(). Итак, мой код выглядит так:

func loadPicture() {
    //check if repeat picture
    secondInt = randomInt
    randomInt = Int(arc4random_uniform(24))
    if secondInt != randomInt {
        pictureName = String(self.PicList[randomInt])
        image = UIImage(named: pictureName)
        self.picture.image = image
        resetTimer()

    }
    else{
        loadPicture()
    }
}
func startTimer(){
    timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("gameOverTimer"), userInfo: "timer", repeats: true)
}

func resetTimer(){

    timer.invalidate()
    startTimer()
}

ИЗМЕНИТЬ

С новым синтаксисом селектора это выглядит так:

func startTimer(){
    timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(NameOfClass.startTimer), userInfo: "timer", repeats: true)
}
person LuKenneth    schedule 30.07.2015
comment
NSTimer.scheduledTimerWithTimeInterval вернет мне новый экземпляр NSTimer, верно? Есть ли способ просто сбросить таймер, например, тот же экземпляр таймера? - person Que20; 08.12.2016
comment
нет, я так не верю. Вы можете аннулировать его, но если вы это сделаете, вы не сможете запустить его снова. @Que20 - person LuKenneth; 09.12.2016