(void)observeValueForKeyPath:(NSString )keyPath ofObject:(id)object change:(NSDictionary<NSString ,id> )change context:(void )context {
if ([object isKindOfClass:[NSURLSessionTask class]] || [object isKindOfClass:[NSURLSessionDownloadTask class]]) {
if ([keyPath isEqualToString:NSStringFromSelector(@selector(countOfBytesReceived))]) {
self.downloadProgress.completedUnitCount = [change[@"new"] longLongValue];
} else if ([keyPath isEqualToString:NSStringFromSelector(@selector(countOfBytesExpectedToReceive))]) {
self.downloadProgress.totalUnitCount = [change[@"new"] longLongValue];
} else if ([keyPath isEqualToString:NSStringFromSelector(@selector(countOfBytesSent))]) {
self.uploadProgress.completedUnitCount = [change[@"new"] longLongValue];
} else if ([keyPath isEqualToString:NSStringFromSelector(@selector(countOfBytesExpectedToSend))]) {
self.uploadProgress.totalUnitCount = [change[@"new"] longLongValue];
}
}
else if ([object isEqual:self.downloadProgress]) {
if (self.downloadProgressBlock) {
self.downloadProgressBlock(object);
}
}
else if ([object isEqual:self.uploadProgress]) {
if (self.uploadProgressBlock) {
self.uploadProgressBlock(object);
}
}
}
在第一行判断object时,已经判断了是否是NSURLSessionTask,为什么还要判断或是否是NSURLSessionDownloadTask,NSURLSessionDownloadTask不是已经是NSURLSessionTask的子类了么?
NSURLSessionTask est en fait un cluster de classe. La tâche générée par NSURLSession ne renvoie pas nécessairement le type de tâche spécifié. Par conséquent, kindOfClass ne prend pas toujours effet. Pour plus de détails, veuillez vous référer à la description de AFURLSessionManager.m dans la méthode de chargement.
Spécifique au problème actuel, c'est parce que la classe de base de __NSCFURLSessionDownloadTask sur iOS 7 n'est pas __NSCFURLSessionTask, donc isKindOfClass générera une erreur. Vous pouvez le découvrir en consultant le commit correspondant.