AFURLSessionManager里监听事件为什么要判断object是否是NSURLSessionDownloadTask

  • (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的子类了么?

阅读 2.7k
1 个回答

NSURLSessionTask实际上是Class cluster,通过NSURLSession生成的task返回的并不一定是指定的task类型。因此kindOfClass并不总会生效,具体可以参见AFURLSessionManager.m在load方法中的说明
特定于当前问题,是由于iOS 7上__NSCFURLSessionDownloadTask的基类并不是__NSCFURLSessionTask,因此isKindOfClass会出错。查看对应的commit就可以知道了。

推荐问题