2012-03-21 19 views
3

dispatch_queue_createを使用し、その後dispatch_asyncを使用するエンドレスループのメソッドを起動します(コードループはディスパッチされたブロックの内側にあります)。アプリケーションがバックグラウンドで配置されているときにGCDディスパッチされた操作が実行されない

ループは完全に実行されます。ただし、アプリケーションがバックグラウンドになると一時停止します。その後、アプリケーションがフォアグラウンドをとったときに再起動します。

これを防ぐにはどうすればよいですか?私はhereを見てきましたが、優先順位は私が選べるものの一つではないようです。

+0

iOSのバックグラウンドで無限にループを実行したいですか? –

+0

@pcperiniはい、私はキューをポーリングしています。私は無限ループに組み込まれているので、あなたのiPadのバッテリーを消耗させないようにしています。)... –

+0

私はそれが問題ではないと確信しています。アプリが電話(Skype)または音楽プレーヤー(Spotify)でない限り、バックグラウンドで無限ループを実行することはできません。あなたがしなければならないことは(Appleに関する限り)データ更新のためにプッシュを使用していることです。 –

答えて

5

-[UIApplication beginBackgroundTaskWithExpirationHandler:]メソッドを使用して、バックグラウンドタスクを開始します。 OSは10分を与え、終了時にexpirationHandlerブロックを呼び出します。

このメソッドは、デバイスがバックグラウンドでコードを実行できない場合、またはそれ以外の方法で終了するために使用する必要があるタスクIDをの場合はUIBackgroundTaskInvalidを返します。

- [UIApplication endBackgroundTask]を呼び出すことで、早く終了できます。

ブロックの先頭でタスクを開始し、終了時に終了することができます。無限ループの場合は、applicationWillResignActiveメソッドでタスクを開始し、applicationDidBecomeActiveで終了してください。しかし、は10分しかないので、アプリケーションで場所、音声、またはVoIPを使用する必要があります。

+0

それは素晴らしい(ちょうどそれを試した)です。だから、基本的には10分の延長を得ています。そして、私は水の中で死んでいますか?それのまわりで、右か?私はそれがうまくいくと思うが、ちょうど確認する... –

+0

"Appleが承認した"バックグラウンドタイプのタスクの1つを使用することを決めた場合。あなたがオーディオを再生すると、あなたのアプリケーションは、より多くのオーディオデータを提供するためにバックグラウンドで呼び出されます。場所の更新が必要な場合、アプリはバックグラウンドで通知されます。どのように動作するのか分かりませんが、 OSを使ったあなたのアプリ^^ – fbernardo

+0

うーん...実際には、私はオーディオを再生しないので、10分で十分かもしれない。それとも、MIDI処理アプリケーションなので、アップルは気にしないでしょう。だから明確にするために、もしアプリケーションが全くオーディオを使用していれば、無限のバックグラウンドを得るか、オーディオ機能だけを得るのだろうか? –

関連する問題