2016-07-16 5 views
0

タイマーをバックグラウンドで実行したい。だから私はシングルトンを作りました。NSTimer scheduledTimerWithTimeInterval - ファンクションを呼び出さない

設定した5.0秒後には、timeEnded()という関数を呼び出さないという問題があります。 Xcodeは、何か問題を解決するために、関数の前に@Objcを追加することを提案しています。しかし、それはまだその機能を呼び出さない。何か案は?

class TimerService { 
    static let instance = TimerService() 
    var internalTimer: NSTimer? 

    func startTimer() { 
     guard internalTimer != nil else { 
      return print("timer already started") 
     } 
     internalTimer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: #selector(TimerService.timeEnded), userInfo: nil, repeats: false) 
    } 

    func timeEnded() { 
     //NSNotificationCenter.defaultCenter().postNotificationName("timerEnded", object: nil) 
     print("timer Ended") 
    } 
} 
+0

は、あなたのXcodeのバージョン –

+0

あなたはどこにでも実行ループにタイマーを追加するようにしてください?スクリーンショットではなくコードを投稿する必要があります。 –

+0

Xcode 7.3.1 - 申し訳ありませんが、私はコードに置き換えました。私はそのループについては分かりません。しかし、それは私が持っている別の質問に関連しています:私はViewController内の 'viewDidLoad()'メソッドでタイマーを開始します。それを実行すると、コンソールに「タイマーは既に起動しています」というメッセージが表示されます。たぶんそれは問題と関係がありますか? – Quantm

答えて

3

startTimer()関数は、タイマーを作成するコード行に達する前に常に返されるため、実際にはタイマーを起動することはありません。あなたのguard声明の中で

internalTimer != nil場合にのみ、関数の実行を継続していますが、タイマーを設定する唯一の場所は、その文後です。したがって、タイマーは作成されず、internalTimerは常にnilになります。

これはあなたの問題を解決する必要があります

func startTimer() { 
    guard internalTimer == nil else { 
     return print("timer already started") 
    } 
    internalTimer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: #selector(TimerService.timeEnded), userInfo: nil, repeats: false) 
} 
+2

あなたは正しいです。私は 'timer == nil'で正しいガードステートメントを表示する答えを編集することをお勧めします。 – Paulw11

+0

良いアイデア!しましょう。 – Mischa

2

セレクタはObjective-Cの機能であり、動的Obj-Cランタイムに公開されているメソッドでのみ使用できます。純粋なSwiftメソッドのセレクタを持つことはできません。

クラスがNSObjectから継承する場合、そのパブリックメソッドは自動的にObj-Cに公開されます。あなたのクラスはNSObjectから継承しないので、このメソッドをObj-Cに公開するように@objc属性を使用して、Obj-Cセレクタで呼び出せるようにする必要があります。

#selector()はSwift 2.2の新しい構文です。コンパイラは、使用しようとしているセレクタが実際に存在するかどうかをチェックできます。古い構文は廃止され、Swift 3.0で削除されます。

+0

さて、私はエラーを理解しました:)それはスタートです。しかし、残念ながら関数はまだ呼び出されていません – Quantm

+1

実際にはiOS 10ではセレクタは必要ありません。 iOS 10にはブロックベースのタイマーがあります。 – matt

関連する問題