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.6k
1 个回答

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题