Rumah > Soal Jawab > teks badan
(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的子类了么?
PHPz2017-04-17 17:49:39
NSURLSessionTask sebenarnya ialah gugusan Kelas Tugas yang dijana oleh NSURLSession tidak semestinya mengembalikan jenis tugas yang ditentukan. Oleh itu, kindOfClass tidak selalu berkuat kuasa untuk mendapatkan butiran, sila rujuk penerangan AFURLSessionManager.m dalam kaedah muat.
Khusus untuk masalah semasa, ia adalah kerana kelas asas __NSCFURLSessionDownloadTask pada iOS 7 bukan __NSCFURLSessionTask, jadi isKindOfClass akan ralat. Anda boleh mengetahui dengan melihat komit yang sepadan.