私はAFNetworking
自分のプロジェクトで使用しています。私が把握する必要がある主なことは、リモート サーバーからすべてのファイルが iOS デバイスの Document ディレクトリにロードされた瞬間をどのように検出できるかということです。
現在、私はこのアーキテクチャを持っています:
このメソッドにはサイクルがあり、新しい Zip ファイルをダウンロードするメソッドを呼び出します。-stopLoad
サイクルが終了した直後に呼び出されるメソッドを見てください。以下の理由により:
- (void)startLoad {
for (NSDictionary *item in items) {
if ([self checkIfNeedUpdateQZTestModelWithItem:item]) {
NSString *urlString = [item objectForKey:@"url"];
NSNumber *updateID = [item objectForKey:@"update_id"];
[self downloadZipFileWithUrlString:urlString andUpdateID:updateID];
}
}
[self stopLoad];
}
- (void)downloadZipFileWithUrlString:(NSString *)urlString andUpdateID:(NSNumber *)updateId
{
NetworkManagerBlock block = ^ {
NSString *fileName = [self fileNameFromUrlString:urlString];
FileManager *fileManager = [FileManager new];
[fileManager unZipFileWithFileName:fileName andUpdateID:updateId];
};
[self downloadFileWithUrlString:urlString withCompletionBlock:block];
}
- (void)downloadFileWithUrlString:(NSString *)urlString withCompletionBlock:(NetworkManagerBlock)block
{
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *fileName = [self fileNameFromUrlString:urlString];
NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:fileName];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
block();
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
[operation start];
}
私が推測するように、すぐに呼び出す理由-stopLoad
は非同期操作です。そのため、10 個または 20 個のファイルをダウンロードする必要がある場合、最後のファイルがいつダウンロードされるかわかりません。したがって、私の場合、-stopLoad
メソッドは、サイクルの終了後に呼び出すすべての操作の完了について教えてくれません。
すべてのファイルがいつロードされたかを把握するには、操作スタックまたはこのようなものが必要だと思います。私は正しいですか?しかし、私はまだ正しい解決策について考えています。何か案は?ありがとう。
NSInteger
variableも追加しましoperationsCount
た。operationsCount
各ブロックで減少しsetCompletionBlockWithSuccess
、変数値が-1に等しいかどうかを確認してから呼び出し-stopLoad
て動作しますが、それは美しい解決策ではないと思います。