阅读 AFNetWorking

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,通过设置代理和嵌入通知来获取请求的结果。

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值