3

私は2段階のプロセスを実行しようとしています:

  1. 写真の同時アップロード
  2. ユーザー入力後、コンテンツを投稿

、「写真を追加」するときのFacebookアプリの動作と非常によく似ています

デフォルトを使用して、最初にバックグラウンドで写真のアップロードを開始したいと考えていますNSOperationQueueDefaultMaxConcurrentOperationCount 。これらの操作により、2 番目の投稿と一緒に送信する必要がある情報が返されます。

ただし、アプリの性質と並行性のため、次の条件が満たされている場合にのみコンテンツを投稿するように構成するにはどうすればよいですか。

  1. すべての写真がアップロードされました
  2. コンテンツを投稿するためのユーザー アクション

いくつかのシナリオが発生する可能性があります。

  1. 投稿する写真はありません、ユーザー投稿コンテンツ、コンテンツはすぐに投稿する必要があります
  2. 写真のアップロードが完了し、ユーザーがコンテンツを投稿しました。コンテンツはすぐに投稿する必要があります
  3. 写真のアップロードが完了していません。ユーザーがコンテンツを投稿しています。コンテンツを投稿する前に、すべての写真のアップロードが完了するまで待つ必要があります。

NSOperationQueue写真のアップロードを作成して を確認する必要があると思いますoperationCount。== 0 の場合、ユーザーが をタップするとすぐにコンテンツが投稿されますUIButton

しかし、写真のアップロードが完了していない場合、どのように待つのですか? waitUntilAllOperationsAreFinished疑似コードで次のように使用する必要があります。

// User taps on UIButton to post his content and this is in a ViewController
- void postMyContent:
{
   [self.photoUploadQ.waitUntilAllOperationsAreFinished]

   // Post my content now              
}

これは正しいです?photoUploadQデフォルトの同時実行性があるため、2 番目のタスクを に追加できません。

ドキュメントのため、デッドロック/ブロッキングが懸念されます。

このメソッドが呼び出されると、現在のスレッドがブロックされ、レシーバーの現在の操作とキューに入れられた操作の実行が完了するまで待機します。現在のスレッドがブロックされている間、レシーバーは、すでにキューに入れられた操作を起動し、実行中の操作を監視し続けます。この間、現在のスレッドは操作をキューに追加できませんが、他のスレッドは可能です。保留中の操作がすべて完了すると、このメソッドは戻ります。

キューに操作がない場合、このメソッドはすぐに戻ります。

ありがとう!

4

1 に答える 1