2012-01-20 13 views
11

私はバックグラウンドで実行する必要があるアプリを開発しています。それは場所ベースのアプリなので、常に動作し、OSはそれを殺しません。iphone - バックグラウンドでNSTimers

10秒ごとに(ちょうどデバッグのために)情報を送信する必要があります。バックグラウンドでタイマーを設定します。 10秒ごとに呼び出される関数でブレークポイントを設定していますが、アプリケーションを一時停止してからタイマーを呼び出すと、10秒ごとにタイマーが問題なく実行されます。

私はデバッグしていないときにタイマーが実行されていると思っていましたが、デバッグを一時停止しなかったのと同じことではありません。

私の質問はなぜですか?タイマーは、一時停止後に動作するため正しく設定されていますが、そうではありません。

アイデア?

self.timer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(doStuff) userInfo:nil repeats:YES]; 

AND関数で私がWebサービスに接続します。

私はタイマーを設定する方法があります。

ありがとうございました。

+0

これはデバッグではなくタイマーに関するものです。あなたのタイトル、plsを修正してください。そして、この質問にタグを付けるためにあなたがすることができる "客観的なc"は最高ですか? – matt

+0

[NSTimersはバックグラウンドで実行されていますか?](http://stackoverflow.com/questions/5901398/nstimers-running-in-background) – matt

答えて

20

私は同様のアプリデザインを持ち、同じことに固執していました。私は、インターネット上のどこかに見つけた。これは、あなたはまだ物事がそれを停止するつもりはしていないOSを伝える声明applicationDidEnterBackground:

UIBackgroundTaskIdentifier locationUpdater =[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     [[UIApplication sharedApplication] endBackgroundTask:locationUpdater]; 
     locationUpdater=UIBackgroundTaskInvalid; 
    } ]; 

のこのタイプを追加することです。

私は私のタイマーは私が私の場所マネージャのデリゲートメソッドでタイマーを設定し、この関数に

//this is a wrapper method to fit the required selector signature 
- (void)timeIntervalEnded:(NSTimer*)timer { 
    [self writeToLog:[NSString stringWithFormat:@"Timer Ended On %@",[NSDate date]]]; 
    [self startReadingLocation]; 
    [timer invalidate]; 
    timer=nil; 
} 

を添付しています。

私はあなたの痛みを感じます。私はこれらのことが非常に精巧であることを発見した。これは私のために働いたものです。私はそれが助けて欲しい私はあなたがバックグラウンドでできることに本当に制限がないことを発見しました。

+0

大変ありがとうございました。 – subharb

+0

実際、それは私の全問題を解決しませんでした。今私はバックグラウンドタスクを終了しないので、明らかにクラッシュログを取得します。これは、アプリケーションがバックグラウンドにある限り、タスクが決して終了しないためです。 NStimerはエンドレスに繰り返します。それは可能ですか?またはそれは私がGPSにアクションをフックする必要があります場所のアプリですか? – subharb

+0

私はクラッシュが何であるか正確にはわかりません。私はバックグラウンドでソケット接続を維持することができるので、私はあなたがロケーションベースのものに限られていないことを確信しています。しかし、私が言ったように、これらの問題は解決するのが最も簡単ではありません。申し訳ありませんが、私はもっと助けになることはできませんでした。私のタイマーは(私が見ている限り)無限に実行されますが、backgroundTimeRemainingを印刷することがチェックされています(それは絶対に下がってはならず、非常に大きくなるはずです) – utahwithak

0

バックグラウンドでできることには制限がある場合があります。バックグラウンドに入る前に、実行ループにタイマーを追加してみてください。それでも動作しないかもしれません。バックグラウンドで実行できるコードは、登録したコアロケーションメソッド(たとえば、locationManager:didUpdate...)によって呼び出されたコードだけです。しかし、私の印象は、あなたがバックグラウンドに入る前にすでに動作しているタイマーが引き続き実行されるということです。

+0

しかし、それはなぜ私はそれが動作するデバッグを説明しません。それは私が理解していないものです。私は、アプリケーションがデバッグまたは単に実行する同じ方法で動作すると仮定します – subharb

+0

私はあなたが(フォアグラウンドでまだタイマーを設定して)私が提案したものを試してみたら、それは問題を解決したと思います。これは実際にあなたが受け入れたソリューションとおそらく同じでしょう。あなたの問題は、タイマーを設定する前に、あなたがすでに背景になっていて、あなたのランロップが止まっていたことでした。ブレークポイントで一時停止し、バックグラウンドで再開すると、実行ループに新しいチャンスが与えられます。その時点で、タイマーがランループに追加されました。それは推測ですが、私はそれが現象を説明すると信じています。 – matt

関連する問題