2

現在作業中のアプリの同期クラスを作成しました。

大量のデータがあるため、最初にデータ カウントを取得してから、NSOperationQueue. これはすべて正常に機能し、同期アルゴリズムがすばやく機能しています。

その仕組みは次のとおりです...

- (void)synchroniseWithCompletionHandler://block for completion handler
                            errorHandler://block for error handler
{
    [self.queue addOperationWithBlock
     ^{
           //Create an NSURLRequest for the first batch
           //Send the request synchronously
           //Process the result
           //If error then cancel all operations in the queue, run errorHandler and return.
      }];

    [self.queue addOperationWithBlock
     ^{
           //Create an NSURLRequest for the second batch
           //Send the request synchronously
           //Process the result
           //If error then cancel all operations in the queue, run errorHandler and return.
      }];

    //Add all the remaining batches.

    [self.queue addOperationWithBlock
     ^{
           completionHandler();
      }];
}

これは機能し、メモリ使用量を最小限に抑え、速度を最大に保ちます。ダウンロードとプロセスは両方とも同じブロックにあり、キュー内の次の操作に進む前に両方が処理されるという考え方です。

ただし、呼び出しを認証するためにサーバーに OAuth2 を実装しました。

NXOAuth2 ライブラリを介して NXOAuth2Request を設定することで、これを機能させました。次に、アカウントを設定し、署名付き URL リクエストを引き出します。次に、以前と同じようにこの NSURLRequest を使用します。

これに関する問題は、OAuth トークンが同期の途中で期限切れになると、同期が失敗することです。

NXOAuth2 ライブラリには機能があります...

+ (void)performMethod:(NSString *)aMethod
           onResource:(NSURL *)aResource
      usingParameters:(NSDictionary *)someParameters
          withAccount:(NXOAuth2Account *)anAccount
  sendProgressHandler:(NXOAuth2ConnectionSendingProgressHandler)progressHandler
      responseHandler:(NXOAuth2ConnectionResponseHandler)responseHandler;

これは、トークンの更新を行った後にリクエストを再送信することで、期限切れのトークンの状況を処理します。

ただし、この関数は非同期であるため、同期プログラムにどのように適合させるのが最適かわかりません。

これを使用して操作を追加し、処理を完了ブロックに入れることができます。しかし、これを行うと、すべてのダウンロードがほぼ同時に実行され、ダウンロードが処理される順序を保証する方法がなくなります (データの依存関係のために、厳密な順序で処理する必要があります.

今考えられる唯一の方法は、それらをすべてデイジーチェーン接続することです...

[NXOAuth2Request performFirstRequest...
    {
        deal with the data.
        [NXOauth2Request performSecondRequest...
            {
                deal with the data.
                [NXOauth2Request performThirdRequest...
                    {
                        deal with the data.
                        finish
                     }];
             }];
      }];

そして、これはただ面倒で、非常に面倒になる可能性があります.

これを処理できる他の方法はありますか?私が考えることができる唯一の他のことは、自分自身をさわやかにしようとすることです.

4

1 に答える 1

3

私はブロックが大好きですが、並行 NSOperations で行うのが最適なタスクがいくつかあります。ストア内のアプリで使用するのとまったく同じファイルを使用して、データをフェッチして処理する、非常にシンプルで非常に簡単に採用できるプロジェクトを github に配置しました。これと同じ戦略をタスクに簡単に適応させることができます。

  • Web フェッチを実行し、データを取得する基本的な同時操作から始めます。
  • サブクラスを使用すると、そのデータをさまざまな方法で処理できます
  • 並行しているため、独自の実行ループがあるため、メッセージの待機をブロックできるため、その中に承認を組み込むことができます
  • 任意のロジックを使用できます。途中で認証に失敗した場合は、URL リクエストをキャンセルし、認証してから、1 つの操作で別の操作をすべて実行できます。
  • 一度に複数の操作をアクティブにしないように操作を連鎖させることができます

私はすべての Web インタラクションにこの構造を使用しており、受信したデータに対してさまざまな種類の処理を行う 30 ほどのサブクラスがあります。

このプロジェクトには、次の 3 つの主要なクラスがあります。

  • OperationsRunner - NSOperationsQueue への高レベル インターフェイスを提供する非常に小さなクラス

  • ConcurrentOperation - 最低限

  • WebFetcher - NSURLConnection を実行し、完了すると完了するクラス

他のサブクラスは、データを処理するための「完全な」メソッドを提供するだけで済みます。

于 2012-09-05T11:23:54.783 に答える