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

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

ただいまの
回答率

89.65%

[Objective-c]現在時刻と前回測定時刻の差を求めたい。

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 2,294

Satochan24

score 84

5秒、10秒、20秒などの時間間隔でGPSデータを取得するアプリを作成中なのですが、
前回測定時刻から、時間間隔以上経過したら、緯度・経度を取得する処理をしたいと考えています。変数式は以下です。

currentTime:現在時刻
oldTime:前回測定時刻、初期値はゼロに設定し、GPSデータ取得後、currentTimeの値を入れます。
interval:ピッカーで設定する時間間隔(秒)

式:
if (currentTime >= oldTime + interval) {緯度、経度取得処理}

本やWebで調べると、時刻の形式で現在時刻を取得する方法などは載っていますが、この計算式に即適用できる形式で取得する方法があれば教えてください。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

checkベストアンサー

+1

そのタイミングの時刻は[NSDate date]で取得できます。

まず、比較したい過去の時刻をoldTimeに一旦入れておきます。

次に時間が経ってか新たにら[NSDate date]でその時刻を取得します。

最後にNSDate同士の差分を比較するには、timeIntervalSinceDateというメソッドを使います。

これで何秒経っているのか比較出来ます。

oldTime = [NSDate date];

....

currentTime = [NSDate date];

timeInteval = [currentTime timeIntervalSinceDate:oldTime];

if (timeInteval >= 5) NSLog (@"5秒以上経過");

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/06/17 09:52

    回答、ありがとうございます。
    なるほど!これのほうがスッキリしている感じですね。試してみます。また報告します。

    キャンセル

  • 2015/06/17 18:42

    ありがとうございました。うまくいきました。oldTimeをどの時点で設定するかという調整は必要ですが、時刻で処理できるので、ログにはきだしたとき便利だと思います。

    キャンセル

+1

時刻の比較・差分については以下が参考になります。
[Objective-C] NSDate周りのまとめメモ

ただし、通常一定時間ごとに処理を行う場合、タイマー(NSTimerクラス)を用いて処理を行います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/06/16 16:06

    回答ありがとうございます。
    参考のサイト見ました。差分の出し方載ってましたが、oldTimeが初期値0なので、それと比較計算できるCurrentTimeの書式が分からなかったです。秒だけにすればよいのでしょうか?

    キャンセル

0

if (currentTime >= oldTime + interval) {
// 緯度、経度取得処理
oldTime = currentTime; 更新するだけで良いと思います。


定期的に更新するなら、インターバル使った方が楽ですよ。

-(void) viewDidload{
  [NSTimer scheduledTimerWithTimeInterval:60.0f ←指定した秒数で呼ばれる
           target:self selector:@selector(run:) userInfo:nil repeats:YES];
}
-(void)run:(NSTimer*)timer{
経度、緯度取得
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/06/16 20:14

    回答ありがとうございます。
    そうですね。それのフォーマットを秒のsだけにして、実行してみたたら、60秒過ぎるとまた0に戻るらしく、うまくいきませんでした。現在時刻からのトータルの秒数が必要な状況です。

    キャンセル

  • 2015/06/16 20:31

    C++を使えば何とかなるかもですね。
    http://yut.hatenablog.com/entry/20130617/1371425713

    キャンセル

  • 2015/06/16 21:31

    Objective-CにもC++は使えるのですか?(C++はあまり分かりませんが・・・)

    キャンセル

0

現在時刻というわけでなく、ただ単に秒数を数えたいだけなら、CFAbsoluteTimeGetCurrent()を使ってください。

CFAbsoluteTime oldTime = CFAbsoluteTimeGetCurrent();

CFAbsoluteTime currentTime = CFAbsoluteTimeGetCurrent();
CFAbsoluteTime interval = 10.0;
if (currentTime >= oldTime + interval) {
  // 緯度、経度取得処理
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/06/16 20:17

    回答、有難うございます。
    これだと、CFAbsoluteTimeという型になって、ifの条件式で普通の数値計算できなくないですか?インターバルの値は固定ではなく、ピッカーからとってきて、NSStringをint型に変換して使っています。

    キャンセル

  • 2015/06/16 20:23

    typedefしているだけで、CFAbsoluteTime型の実体はdouble型です。

    キャンセル

  • 2015/06/16 21:29

    なるほど。ありがとうございます。とりあえず、今のところ正常動作しているようです。

    キャンセル

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

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