2015-07-02 2 views
12

Как проверить, работает ли NSTimer или нет в Swift. В Obj-C код должен быть таким, как я предполагаю:Как проверить, работает ли NSTimer в Swift?

if (!myTimer) { 
    //DO 
} 

Я пытаюсь установить его в Swift, как это и он показывает ошибку.

if !myTimer { 
// DO 
} 
+0

Предоставьте всю необходимую информацию, которая будет содержать фактическое полное сообщение об ошибке. – zaph

+0

@amro shahbari swift 3.1 не работает –

ответ

25

Что я делаю (на обоих языках), чтобы сделать мой таймер слабым. Быстро это было бы слабым факультативным.

weak var myTimer: NSTimer? 

Затем я создаю таймер с

myTimer = NSTimer.scheduledTimerWithTimeInterval(1, 
      target: self, 
      selector: "timerFired:", 
      userInfo: nil, 
      repeats: false) 

И тогда вы можете использовать

if timer == nil 

сказать, если он работает.

Чтобы остановить таймер, который вы просто позвоните

myTimer?.invalidate() 

В Objective-C было бы

[myTimer invalidate]; 

Это работает в Objective-C, так как отправка сообщений с нулевыми указателями действительно, и просто делает ничего.

Если вы не хотите использовать слабый факультативный вариант, вы можете запросить таймер, чтобы узнать, работает ли он, глядя на его свойство valid.

+2

Просто потому, что 'timer' не равен нулю, не говорит, работает ли он. – zaph

+3

Он делает, если вы делаете его слабым. Тогда единственная собственная ссылка - это цикл выполнения, и после того, как она срабатывает/когда она недействительна, она освобождается и отключается. Это удобно. –

+0

Нет, со слабым указателем, \t timerWithTimeInterval: target: selector: userInfo: repeat: создает таймер, который немедленно освобождается, потому что он имеет нулевые ссылки. Это вырожденный случай. Попытайтесь описать. Оно работает. Обещаю. –

2
if !myTimer.valid { 
    //DO 
} 
+0

Для этого работа 'myTimer' должна быть объявлена ​​как свойство' weak'. – zaph

+0

@zaph, это неправильно. Для этого подхода таймер ** не может быть объявлен слабым. –

11

Как насчет опции ниже? Вы можете видеть, работает ли это для вас

if myTimer.valid { 
} 
+0

Для этого работа 'myTimer' должна быть объявлена ​​как свойство' weak'. – zaph

+3

@zaph, no. Мой подход к тому, чтобы сделать его слабым и проверять ничтожные работы, ИЛИ вы можете сделать его сильным, а затем проверить, нет ли timer.valid == true. Использование 'myTimer.valid' делает ** NOT ** требует, чтобы' myTimer' был слабым. –

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