为多个文件下载添加子进度
我在我的项目中使用AFNetworking 3.0下载多个文件。 我想显示所有文件的单一下载进度。 我将每个文件下载的每个subprocess添加到父进程。 但它不工作,应用程序崩溃。 我收到错误 –
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '<DownloadManager: 0x7f92e2f6e130>: An -observeValueForKeyPath:ofObject:change:context: message was received but not handled. Key path: fractionCompleted
这是我的下载类 –
@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
您忘记实现observeValueForKeyPath:ofObject:change:context:
方法。
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *, id> *)change context:(void *)context { if ([keyPath isEqualToString:@"fractionCompleted"]) { // process value } }