現在作業中のアプリの同期クラスを作成しました。
大量のデータがあるため、最初にデータ カウントを取得してから、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
}];
}];
}];
そして、これはただ面倒で、非常に面倒になる可能性があります.
これを処理できる他の方法はありますか?私が考えることができる唯一の他のことは、自分自身をさわやかにしようとすることです.