優れたAFNetworkingライブラリを使用していますが、NSOperationQueue で操作を追跡するのに問題があります。NSOperationQueue に NSOperation オブジェクトを追加していますが、進行状況を追跡する必要があります。そのため、UIProgressView を更新してキューが完了するまでの距離を表示し、キューが完了したらコード ブロックを実行します。
私はKVOを試しました-ここで答えを使用して: NSOperationQueueがすべてのタスクを終了したときに通知を受け取りますが、キュー内の操作が一時的に operationCount プロパティをデクリメントするのに十分な速さで完了する場合があるという問題に遭遇します(そこの2番目の答えで詳しく説明されています) 0 - これにより、受け入れられた回答のコードに問題が発生します。つまり、キュー内のすべてのオブジェクトが終了した後に実行されるコードが時期尚早に実行され、結果として進行状況の追跡が正確ではなくなります。
私が試したバリエーションは、NSOperationQueue に追加する各 NSOperation の成功ブロックで operationCount == 0 をチェックし、それに基づいてコードを実行することです。
[AFImageRequestOperation *imgRequest = [AFImageRequestOperation imageRequestOperationWithRequest:urlRequest success:^(UIImage *image) {
//Process image & save
if(operationQ.operationCount == 0){
// execute completion of Queue code here
}
else {
// track progress of the queue here and update UIProgressView
}
}];
ただし、KVO と同じ問題が発生します。
完了ブロックを使用してディスパッチキューでGCDを使用することを考えました-NSOperationQueueを非同期にディスパッチしてから完了ブロックを実行しますが、キューの進行状況を追跡してUIProgressViewを更新することに関する問題は解決しません。
こちらも未使用
AFHttpClient enqueueBatchOfHTTPRequestOperations:(NSArray *) progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations)progressBlock completionBlock:^(NSArray *operations)completionBlock
私の画像は(1つのベースURLではなく)いくつかの異なるURLから来ているためです。
提案や指針をいただければ幸いです。ありがとう。
ただ最後の更新:
マットの助けを借りて(受け入れられた回答を参照)、最後に AFHTTPClient enqueueBatchOfHTTPRequestOperations を使用してこの問題を解決し、コメントにも注意してください。
AFHTTPClient を使用せず、NSOperationQueue だけを使用する別のソリューションに出くわしました。誰にとっても役立つ場合に備えて、これも含めましたが、AFNetworking ライブラリを使用している場合は、受け入れられた回答をお勧めします (最もエレガントで実装が簡単であるため)。