2017-07-11 1 views
0

現在実行中かどうかを調べるためにタイマ機能を書いていますが、タイマ変数がゼロになっているようです。そのため、新しいタイマーインスタンスの作成が継続されます。swift 3タイマの実行を確認する

weak var myTimer: Timer? 

// starting a timer 
func startTimer(timer: Timer?, interval: Double, _selector: Selector, _repeats: Bool){ 
    weak var _timer = timer 

    if (_timer == nil){ 
     _timer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: _selector, userInfo: nil, repeats: _repeats) 
    } 
} 

// stopping a timer 
func stopTimer(timer: Timer?){ 
    var _timer = timer 

    if (_timer != nil){ 
     _timer!.invalidate() 
     _timer = nil 
    } 
} 

タイマーが開始された後も、どういうわけか

self.startTimer(timer: self.myTimer, interval: 0.1, _selector: #selector(self.updateTimer), _repeats: true) 

を呼び出すことにより、タイマーを開始し、それはまだゼロです。したがって、関数が呼び出される2回目には、別のタイマーインスタンスがスケジュールされます。私がそれをやめようとすると、それはいつも無かったので成功しません。これをどうすれば解決できますか?

ありがとう

+0

'_timer'変数はどちらもローカルスコープにあり、互いに関連していません。あなたは何を期待していますか? – vadian

+0

スコープをチェックし、なぜ弱いのですか – zombie

+0

弱いvarを使用しようとしました。 .isValidメソッドを使用しようとしましたが、これはnilであるため、これは機能しません。 –

答えて

2

これは期待されています。新しいTimerインスタンスを関数内のweak varに割り当てているため、関数スコープを終了するときに割り当てが解除されます。

func startTimer(timer: inout Timer?, interval: Double, _selector: Selector, _repeats: Bool) { 
if (timer == nil){ 
     timer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: _selector, userInfo: nil, repeats: _repeats) 
    } 

同じことがあなたの第二の機能のために行くinoutとしての機能のtimer変数を宣言する必要があります - あなたは外でない変数に、関数のスコープ内でのみローカル変数にnilを割り当てています。

+0

ありがとう、 'inout'キーワードがここにあります。ありがとう。 –

関連する問題