2017-09-04 4 views
0

私はXamarin.iOSで作業しており、Downloadmanagerを実装しています。Xamarin.iOSダウンロードマネージャー

私はすぐにダウンロードマネージャを実装するチュートリアルを見つけました。このチュートリアルでは、C#に素早く書かれたロジックを書きました。 DownloadManagerは動作し、操作を待ち行列に入れて実行します。私が直面している唯一の問題は、Appのサスペンドモードへの移行です。キューの動作はあまり決定的ではありません。場合によっては、すべてのキューに入れられた操作が実行され、アプリケーションが実行を中止することがあります。

ユースケース1: 私はファイルの同期を開始し、iPadをロックします。ほとんどの場合、キューに入れられた操作が実行されます。しかし時々私がiPadのロックを解除すると、アプリケーションはバックグラウンドに送られ、アプリケーションに戻るためにホームボタンを2回タップしなければならない。この場合、ファイルの同期は途中で何とか止まった。

使用ケース2:私はファイルの同期を開始し、バックグラウンドでアプリを送信します。以前の使用例と同じ動作です。場合によってはすべての操作が実行され、操作が停止することがあります。

ユースケース3:お客様が同期を開始し、帰ってから数時間が経過して同期が完了せず、アプリケーションがバックグラウンドになると、iPadが無人状態になります。平均して約70%の同期が行われます。

私は、要素として "DownloadOperation"を持つ "NSOperationQueue"を使用しました。 "DownloadOperation"は、 "Asynchronous"に設定された実行を持つNSOperationオブジェクトのラップです。

可能性のある質問

  • 私は、アプリケーションの状態が変化したとき、「NSOperationQueue」に何が起こるかわかりませんか?
  • "NSOperationQueue"の使用法は、DownloadManagerの実装に適していますか?
  • 「NSOperationQueue」および/または「NSOperation」の議論を楽しみにしてい

の実行の最適化のための任意の一般的なヒントがあります。

P.S. "背景モード"と "バックグラウンドフェッチ"を有効にしました

+0

私はあなたがキャンセルトリガを必要と思う、あなたはタスクのためにこれを行うことができます、NSOperationQueuesについてはわかりません。 cancallationトリガーを実装することができれば、操作が停止するか、アプリのリロードがそれに応じてそれを処理できるかどうかがわかります。 – Digitalsa1nt

+0

@ Digitalsa1nt私は操作をキャンセルしたくないので、私は彼らがアプリケーションが終了した後も実行を継続したい。これが、NSOperationsでOperationQueueとNSUrlSessionを使用する理由です。しかし、あなたのコメントに感謝します。私は誰かがこの問題の手がかりを持っていることを願っています。 –

+0

iOSがアプリケーションを終了した後、コードを無期限に実行し続けることはできません。あるいはそうするためのリンゴのガイドラインに違反していると言わなければならない。うまくいけば、誰かがあなたの周りの仕事を見つけるだろう。 :) – Digitalsa1nt

答えて

0

あなたの説明によると、NSURLConnectionを使用して背景のダウンロードを行うことが推奨されています。また、Background Fetchは少量のコンテンツのためのものであり、それはあなたのシナリオに適していないである、日和見アクティブになります。

少量のコンテンツ新しいコンテンツをチェックするために必要な日和見

アプリをフェッチ定期的にシステムに目を覚ますように要求して、そのコンテンツのフェッチ操作を開始できるようにします。

だから、あなたは正式にバックグラウンドでコンテンツをダウンロードすることをお勧めしNSURLSessionを使用するように切り替えることができます。バックグラウンドセッションを設定するには、アプリが停止または終了した場合(ユーザーがアプリケーションを余儀なくされた場合を除く)、ダウンロードプロセスは引き続き実行されます。このApple documentationを参照してください:ファイルをダウンロードすると、システムが場合に、ダウンロードプロセスの制御を取ることができるように

背景にあるコンテンツをダウンロード

、アプリがダウンロードを開始するにはNSURLSessionオブジェクトを使用する必要がありますアプリは一時停止または終了されます。バックグラウンド転送のためにNSURLSessionオブジェクトを設定すると、システムは別のプロセスでこれらの転送を管理し、ステータスを通常の方法でアプリに返します。転送が進行中にアプリが終了すると、システムはバックグラウンドで転送を継続し、転送が完了したとき、または1つ以上のタスクにアプリの注意が必要なときにアプリを起動します(必要に応じて)。

...

タスクはまだ終わっていないと、システムがあなたのアプリケーションを終了した場合、システムは自動的にバックグラウンドでタスクを管理し続けています。ユーザーがアプリを終了すると、保留中のタスクはすべてキャンセルされます。 NSURLSessionを経由して、バックグラウンドのダウンロードマネージャを作成する方法について

、あなたはを参照することができます:迅速で

ブログ:Downloading files in background with URLSessionDownloadTask

Xamarinガイド:Walkthrough - Using Background Transfer Service and NSURLSession

私はあなたがダウンロードする必要があると思います複数のファイルがバックグラウンドで表示されます。ここにはあなたのための良いガイドがあります:Downloading multiple files in batches in iOS

+0

"NSURLSession"でManager全体を実装しました。要するに、NSOperationQueueをNSOperationsで作成します。各操作には、DownloadManagerのベースNSURLSessionによって作成されるNSURLSessionDownloadTaskがあります。 これにより、アプリが停止されている場合でも複数のファイルをダウンロードできるようになります。 私はこの投稿を参考にしました - > [link](https://stackoverflow.com/questions/32322386/how-to-download-multiple-files-sequentially-using-nsurlsession-downloadtask-in-s ) –

関連する問題