iOS4デバイスのバックグラウンドで多くのデータを送信するためのベストプラクティス?

StackOverflow https://stackoverflow.com/questions/3928861

質問

サーバーにデータ(POSTを使用)を送信する必要があるアプリがあります。この関数は、NavigationControllerのサブコントローラーの1つでなければならず、ユーザーはこのコントローラーから離れたり、アプリを閉じることができるはずです(iPhone4/iOS4のみがサポートされます)。スレッド/nsoperationまたは//および/および既存の非同期メソッドを使用してデータを送信する必要がありますか?これを実装する方法はありますか?

役に立ちましたか?

解決

わかりました、私は自分の質問に答えます。まず、TCが言ったように、NavigationControllerのビューを閉じることができるように、Application Delegateでこの呼び出しを行う方が良いです。第二に、バックグラウンド処理の始まりをマークします beginBackgroundTaskWithExpirationHandler: そしてそれを終わらせます endBackgroundTask: このような:

.H:

UIBackgroundTaskIdentifier bgTask;

.M:

- (void)sendPhoto:(UIImage *)image
{
  UIApplication *app = [UIApplication sharedApplication];

  bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
    [app endBackgroundTask:bgTask]; 
    bgTask = UIBackgroundTaskInvalid;
  }];


  NSLog(@"Sending picture...");

  // Init async NSURLConnection

  // ....
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

  NSLog(@"Picture sent.");

  UIApplication *app = [UIApplication sharedApplication];

  if (bgTask != UIBackgroundTaskInvalid) {
    [app endBackgroundTask:bgTask]; 
    bgTask = UIBackgroundTaskInvalid;
  }
}

iOSがアプリを終了するまで10分前にあります。この時間を確認できます [app backgroundTimeRemaining]

他のヒント

nsurlconnectionを使用するだけです。 MultiPart/Form-Dataを送信する場合は少し注意が必要です(SimpleUrlConnections/PostController.mの例を参照)。私はそれをアプリ代表に貼り付けますが、私はそのように怠け者です。

ノンブロッキングI/O(つまり、nsurlconnection)が遅すぎない限り、スレッドについてまったく心配しないでください。スレッドには独自のオーバーヘッドがあり、スレッド間コミュニケーションは痛みであり、デッドロックはひどいです。

あなたは何 行う 必要なのは、バックグラウンドの実行を続けるためにバックグラウンドタスクを開始することです(接続のdidfinishloading:and connection:didfailwitherrorでバックグラウンドタスクを終了します)。背景のアプリには、背景タスクの実行が終了するために約10分が与えられます。

asihttpを使用してキューをセットアップします。必要なすべての情報はここにあります:

http://allseeing-i.com/asihttprequest/

これは、達成したいことを達成する最も簡単な方法です。多くのデータを送信するには、UIの応答性を維持するためにバックグラウンドで送信することをお勧めします。 ASIHTTPREQUESTは、複数のクエリ(つまり、進行状況チェック、コールバックなど)をキックするために必要なすべてのメソッドを提供します。

たくさんの素晴らしいiPhoneアプリで使用されています。

ユーザーが何か他のことをしている間に実行する必要がある長い実行プロセスの2番目のスレッドをお勧めします。

考える必要があるもう1つのことは、ユーザーがプロセスを開始してからホームボタンにヒットした場合に何が起こるかです。中断されることにより、サーバーの相互作用はどのように行われますか?ユーザーが次にアプリに入るときに続行できますか?等

言及する投稿をサポートしたい:

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
      [app endBackgroundTask:bgTask]; 

      bgTask = UIBackgroundTaskInvalid;
}];

また、NSOPERATIONサブクラスでも仕事のユニットをカプセル化することをお勧めします。これにより、非常に再利用可能になり、nsoperationQueueと組み合わせると、スレッドの自動的に処理できます。その後、コードを変更したり、アプリの別の場所に表示したりする場合、移動または編集するのは簡単です。

操作キューの使用に関する1つの注意点は、この場合、キュー内から実際に同期URL要求を送信することをお勧めします。これにより、同時操作を心配する必要がなくなります。これがあなたが役立つと思うかもしれないリンクです:

http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationeque/

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top