AFHTTPSessionManager继承AFURLSessionManager继承很多代理
例如 NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate,等
AFURLSessionManager 有几个属性很关键NSURLSession *session;NSOperationQueue *operationQueue
现在要使用AFHTTPSessionManager 来封装一个GET请求
创建AFURLSessionManager 初始化一些参数新建operationQueue,新建session,
设置URL,设置请求序列化和响应序列化,设置请求超时时间,安全机制,还有设置可接受内容类型
application/json 告诉服务端消息主体是序列化后的json字符串。
@"text/javascript",@"text/html",@"text/css"支持javascript,html,css。
application/x-www-form-urlencoded 是针对于POST请求
如果是对于图片请求那就是添加,@"image/jpeg",@"image/png",@"image/jpg"格式支持
manager GET 放将 URL 以及请求参数传到GET方法中,该方法返回一个NSURLSessionDataTask对象,该对象调用resume方法进行请求
请求都会在下面方法进行请求
- (NSURLSessionDataTask *)dataTaskWithHTTPMethod
001 创建NSMutableURLRequest 对象
NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError];
NSURLSession 将一个self.operationQueue封装到里面然后创建self.session
self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue]; self.mutableTaskDelegatesKeyedByTaskIdentifier = [[NSMutableDictionary alloc] init];
002 线程安全创建NSURLSessionDataTask
__block NSURLSessionDataTask *dataTask = nil;
dataTask = [self dataTaskWithRequest:request
uploadProgress:uploadProgress
downloadProgress:downloadProgress
completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
if (error) {
if (failure) {
failure(dataTask, error);
}
} else {
if (success) {
success(dataTask, responseObject);
}
}
}];
在dataTaskWithRequest:uploadProgress:downloadProgress:completionHandler中执行如下方法
001 以url_session_manager_create_task_safely的方式创建dataTask
__block NSURLSessionDataTask *dataTask = nil;
url_session_manager_create_task_safely(^{
dataTask = [self.session dataTaskWithRequest:request];
});
002 执行请求以及对dataTask设置请求数据代理
[self addDelegateForDataTask:dataTask uploadProgress:uploadProgressBlock downloadProgress:downloadProgressBlock completionHandler:completionHandler];
具体方法如下
AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] initWithTask:dataTask];
delegate.manager = self;
delegate.completionHandler = completionHandler;
dataTask.taskDescription = self.taskDescriptionForSessionTasks;
[self setDelegate:delegate forTask:dataTask];
delegate.uploadProgressBlock = uploadProgressBlock;
delegate.downloadProgressBlock = downloadProgressBlock;
设置代理
- (void)setDelegate:(AFURLSessionManagerTaskDelegate *)delegate
forTask:(NSURLSessionTask *)task
{
NSParameterAssert(task);
NSParameterAssert(delegate);
//确保线程安全 加锁
[self.lock lock];
//每个请求任务的任务表识符作为key代理作为value
self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)] = delegate;
//给任务添加通知
[self addNotificationObserverForTask:task];
[self.lock unlock];
//确保线程安全 解锁锁
}
- (void)addNotificationObserverForTask:(NSURLSessionTask *)task {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskDidResume:) name:AFNSURLSessionTaskDidResumeNotification object:task];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskDidSuspend:) name:AFNSURLSessionTaskDidSuspendNotification object:task];
}
- (void)taskDidResume:(NSNotification *)notification {
NSURLSessionTask *task = notification.object;
if ([task respondsToSelector:@selector(taskDescription)]) {
if ([task.taskDescription isEqualToString:self.taskDescriptionForSessionTasks]) {
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidResumeNotification object:task];
});
}
}
}
- (void)af_resume {
NSAssert([self respondsToSelector:@selector(state)], @"Does not respond to state");
NSURLSessionTaskState state = [self state];
[self af_resume];
if (state != NSURLSessionTaskStateRunning) {
[[NSNotificationCenter defaultCenter] postNotificationName:AFNSURLSessionTaskDidResumeNotification object:self];
}
}
总结:AFNetworking请求实质上就是通过包含NSOperationQueue的NSURLSession将NSURLRequest包含里面,通过安全的方式创建(url_session_manager_create_task_safely)
NSURLSessionDataTask,通过设置代理和嵌入通知来获取请求的结果。