現在のデザインでは、フォルダー構造を表すテーブルビューがあります。ユーザーがセルをタップするとAFHTTPRequestOperation
、ファイルをダウンロードするためのanが作成されます。セルが現在のダウンロード状態(none / downloaded / downloading)を示している間に、ファイルがダウンロードされます。
ダウンロード状態はNSManagedObject
、各セルに対応するに設定されます。ダウンロードの完了ブロックで、ダウンロード状態を「ダウンロード済み」フラグに設定しました。これに伴う問題は、ユーザーが現在のテーブルビューデータから別のデータに移動すると、競合ブロックが間違って設定されることです。NSManagedObject
これは、に基づいてルックアップを実行しますNSIndex
。
AFHTTPRequestOperation
一言で言えば、完了時に操作を実行できるように、オブジェクトを一緒に渡す方法を知りたいと思います。NSPredicate
intやstringのように単純で、この値に基づいてリクエストを実行できます。
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[self.operations addObject:operation];
[self.inProgressDownloads addObject:indexPath];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *extension = [[self.selectedFile.name componentsSeparatedByString:@"."] lastObject];
NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat: @"%@.%@", self.selectedFile.item_id, extension]];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];
self.selectedFile.status = DOWNLOADING;
[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"File downloaded to: %@", path);
self.selectedFile.status = DOWNLOADED;
self.selectedFile.is_stored = @YES;
[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
self.selectedFile.status = DOWNLOAD_ERROR;
}];
[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
dispatch_async(dispatch_get_main_queue(), ^{
float percent = (float)totalBytesRead / (float)totalBytesExpectedToRead;
NSLog(@"totalBytesExpectedToRead %d", (int)(percent * 100));
});
}];
[operation start];