在我目前的设计中,我有一个代表文件夹结构的表格视图。当用户点击一个单元格时,AFHTTPRequestOperation
会创建一个来下载文件。当单元格当前显示当前下载状态时下载文件:无/已下载/正在下载。
下载状态设置在NSManagedObject
对应于每个单元的一个上。在我的下载完成块中,我将下载状态设置为“已下载”标志。这样做的问题是,如果用户从当前的 tableview 数据导航到另一个,竞争块将设置错误NSManagedObject
- 它基于NSIndex
.
简而言之,我想知道如何将对象与我的对象一起传递,AFHTTPRequestOperation
以便在完成后可以对其执行操作。它可以像 int 或 string 一样简单,我可以NSPredicate
根据这个值发出请求。
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];