问题
I'm downloading multiple files using AFNetworking 3.0 in my project. I want to show single download progress of all files. I added each child progress of each file download to the parent progress. But it's not working, app crashed. I'm getting the error -
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '<DownloadManager: 0x7f92e2f6e130>: An -observeValueForKeyPath:ofObject:change:context: message was received but not handled.
Key path: fractionCompleted
Here is my download class -
@interface DownloadManager ()
@property (nonatomic, strong) NSProgress *progress;
@property (nonatomic, strong) Settings *settings;
@property (nonatomic, strong) DocumentDirectory *documentDirectory;
@end
@implementation DownloadManager
- (instancetype)init
{
self = [super init];
if (self) {
self.progress = [NSProgress new];
[self.progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:NULL];
self.settings = [Settings new];
self.documentDirectory = [DocumentDirectory new];
}
return self;
}
- (void) dealloc {
[self.progress removeObserver:self forKeyPath:@"fractionCompleted"];
}
//Download the file from remote server in the document directory as Zip format
- (void) downloadCarContents:(NSArray *)urlArray forContent:(NSArray *)contentArray {
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
self.progress.totalUnitCount = urlArray.count;
self.progress.completedUnitCount = 0;
for (NSInteger i = 0; i < urlArray.count; i++) {
NSString *destinationPath = [self.documentDirectory getDownloadContentPath:contentArray[i]];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlArray[i]]];
NSURLSessionTask *task = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
return [NSURL fileURLWithPath:destinationPath];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
}];
NSProgress *childProgress = [manager downloadProgressForTask:task];
[self.progress addChild:childProgress withPendingUnitCount:1];
NSLog(@"Total downloaded : %f", self.progress.fractionCompleted * 100.0);
[task resume];
}
}
@end
回答1:
You forgot to implement the observeValueForKeyPath:ofObject:change:context:
method.
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary<NSString *, id> *)change
context:(void *)context {
if ([keyPath isEqualToString:@"fractionCompleted"]) {
// process value
}
}
来源:https://stackoverflow.com/questions/35249845/adding-child-progress-for-multiple-file-download