2013-09-28 10 views
6

を取得するので、私はSimpleBackgroundFetchのサンプルプロジェクトを見ていた、そしてそれはアプリケーションデリゲートに次のように使用していますので、NSURLSessionは、[OK]を

[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:someTimeInSeconds]; 
//^this code is in didFinishLaunchingWithOptions 


-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
{ 
    //do something + call completionHandler depending on new data/no data/fail 
} 

、基本的に私は、私はここに私のアプリのサーバーを呼び出すことを想定しますいくつかのデータを取得します。

しかし、その後、私はNSURLSession docsを見て、それはこれらの

– downloadTaskWithURL: 

のようなメソッドを持っていたし、それは以下の言った:

このAPIは 認証をサポートするためのデリゲートメソッドの豊富なセットを提供しますアプリが実行されていないとき、またはiOSでアプリが停止しているときに、 が停止しているときにアプリをバックグラウンドで実行できるようにします。

これらの2つのAPIの違いは何ですか?アプリのサーバーから何度も何度もデータをダウンロードしたい場合はどうすればよいですか?

私はちょうど2つの違いについては分かりませんでしたので、私はここで私の疑念を明らかにする必要があると思っていました。 Go StackOverflow!

答えて

9

ハンドラを呼び出します。

  • 背景フェッチ:システムは、いくつかの時間(ヒューリスティック)であなたのアプリを起動し、あなたの仕事は、ユーザーの新しいコンテンツをダウンロード開始にあります。

  • はNSURLSessionNSURLConnectionの交換は、そのアプリが中断された後へのダウンロードがを継続することができます。

+0

オハイオ州オハイオ州、分かりやすくて、ありがとう、ドキュメントが煩わしいことがあります。 「開始/継続」のフレーズは、私がそれを理解するのを助けました。だから、私はApp Delegate/Background Fetchスタイルを使うべきだと思います。ありがとう! – GangstaGraham

+0

もう1つだけ。これらの2つは共同で使用する必要はありません。 user_の_contentに小さなデータ要求が必要な場合、いくつかのフィードの更新のように、NSURLSessionに_background mode_を使用するのは良いことではありません。バックグラウンドモードは主にファイルをダウンロードするためのもので、必要に応じてシステムによって一時停止されることがあります。 – Tricertops

+0

追加情報をありがとう。それは有り難いです。サーバーからJSONを取得しているだけなので、バックグラウンドフェッチは正常です。 – GangstaGraham

3

アプリケーションデリゲートは、ダウンロードが完了したときに呼び出すことができるように、完了ハンドラを格納するためのものです。

- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler { 
    NSLog(@"Handle events for background url session"); 

    self.backgroundSessionCompletionHandler = completionHandler; 
} 

及びこれらが完全に異なるものです

- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session { 
    WebAppDelegate *appDelegate = (WebAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    if (appDelegate.backgroundSessionCompletionHandler) { 
     void (^completionHandler)() = appDelegate.backgroundSessionCompletionHandler; 
     appDelegate.backgroundSessionCompletionHandler = nil; 

     completionHandler(); 
    } 
    NSLog(@"All tasks are finished"); 
} 
0

したがって、ブロックされた通常のdataTaskではなく、デリゲートが付与されたバックグラウンドURLセッションを呼び出す必要がありますか?

0

NSURLSessionは:バックグラウンドモードでのアップロードおよびダウンロードすることを可能と

背景フェッチアプリケーションのサスペンドモード:データの量と以前のデータ30秒間最後process.Onlyの転送の持続時間に応じて行われる処理。