質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.13%

Swift 取得したNSDateどうしの差分の取得

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 2,476

YonamineTK

score 42

Swift2 : NSTimerをバックグラウンドで10分以上の動作

上記質問の、 バックグラウンドに移行したタイミングの時間と、  アプリを再度動作させた時の時間を計算して、  表示させるため、NSDateでバックグラウンドに移行した タイミングの時間と、フォアグラウンドに移行したタイミングの時間を取得したのですが、差分をどうやってとればいいのか悩んでいます。 String型で取得したり、いろいろ考えましたが、いい案が思いつきません。 何か方法がありましたら、教えていただけると幸いです。

カウントダウンの実装は以下のようになっています。 差分をtimerCountから引いて、表示したいと思っています。

var timerCount: Int = 1000
timerCount -= 1
            timerlabel.text = "\(timerCount / 3600): \(timerCount / 60 % 60) : \(timerCount % 60) "
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

やりたいことはこんな感じで動くと思います、コピペして試してみてください。
コンソールに時間が出ます。

import UIKit

class ViewController: UIViewController {

    var backgroundDate: NSDate!
    var timerCount: Int = 0
    var timer: NSTimer = NSTimer()

    override func viewDidLoad() {
        super.viewDidLoad()

        addNotification()

        // 20秒に設定
        timerCount = 20
        startTimer()
    }

    func  addNotification() {
        // 通知の登録
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "didBecomeActive:", name: UIApplicationDidBecomeActiveNotification, object: nil)

        NSNotificationCenter.defaultCenter().addObserver(self, selector: "didEnterBackground:", name: UIApplicationDidEnterBackgroundNotification, object: nil)
    }

    override func viewDidDisappear(animated: Bool) {
        super.viewDidDisappear(animated)
        // 通知の削除
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }

    // フォアグラウンドになった時に呼ばれる
    func didBecomeActive(notify: NSNotification) {

        if let backgroundDate = backgroundDate where timerCount > 0 {

            // バックグラウンドに入った時間とフォアグラウンドになった時間の差分を取得 ※簡易的にIntにキャストしています。
            let timeDiff = Int(NSDate().timeIntervalSinceDate(backgroundDate))
            print("経過時間 : \(timeDiff)")

            if timeDiff < timerCount {

                // 経過時間よりタイマーの残り時間が多かった場合、再度タイマースタート
                timerCount -= timeDiff
                startTimer()
            }
        }
    }

    // バックグラウンドに入った時に呼ばれる
    func didEnterBackground(notify: NSNotification) {

        // タイマー停止
        timer.invalidate()
        // バックグラウンドに入った時間を保持
        backgroundDate = NSDate()
    }

    func startTimer() {

        if timer.valid {
            timer.invalidate()
        }

        // timerを生成する.
        timer = NSTimer(timeInterval: 1, target: self, selector: "countDown:", userInfo: nil, repeats: true)
        NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
    }


    func countDown(timer: NSTimer){

        timerCount--
        print("Timer Count Down : \(timerCount)")

        if timerCount <= 0 {
            timer.invalidate()
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/09 11:48

    Kenterou様のコードを用いて、思っていた実装が出来ました!
    ありがとうございました。

    キャンセル

0

すみません、実際に試せていません。

下記ページの実装例が参考になりませんか? 

    NSTimerでStopWatchを作る

// 現時間
        let currentTime = NSDate.timeIntervalSinceReferenceDate()
        // 開始時間と現時間の差分を取る
        var diffTime: NSTimeInterval = currentTime - startTime!

つまり、diffTime: NSTimeInterval を使えば時刻の差分を取得出来るのではないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る