AFNetworking详解-飞
发布时间: 2023-07-06

AFNetworking3.0主要是对NSURLSession的封装,NSURLConnection是iOS9以前的

NSURLSession,网络通信核心类AFURLSessionManagerAFHTTPSessionManager
AFHTTPSessionManager继承AFURLSessionManager序列化

< AFURLRequestSerialization> 协议
-- AFHTTPRequestSerializer 根类
-- AFJSONRequestSerializer
-- AFPropertyListRequestSerializer

< AFURLResponseSerialization> 协议
-- AFHTTPResponseSerializer 根类
-- AFJSONResponseSerializer
-- AFXMLParserResponseSerializerXMLParser
-- AFXMLDocumentResponseSerializer (Mac OS X) 不适合我们的iOS
-- AFPropertyListResponseSerializer plist
-- AFImageResponseSerializer //国片
-- AFCompoundResponseSerializer //混合

1. 初始化session
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
/* 1.调用父类的方法 2.给url添加“/” 3.给requestSerializer、responseSerializer设置默认值 */- (instancetype)initWithBaseURL:(NSURL *)url           sessionConfiguration:(NSURLSessionConfiguration *)configuration{    //调用父类初始化方法    self = [super initWithSessionConfiguration:configuration];    if (!self) {        return nil;    }    // Ensure terminal slash for baseURL path, so that NSURL +URLWithString:relativeToURL: works as expected    /*     为了确保NSURL +URLWithString:relativeToURL: works可以正确执行,在baseurlpath的最后添加‘/’     */    //url有值且没有‘/’,那么在url的末尾添加‘/’    if ([[url path] length] > 0 && ![[url absoluteString] hasSuffix:@"/"]) {        url = [url URLByAppendingPathComponent:@""];    }    self.baseURL = url;    //给requestSerializer、responseSerializer设置默认值    self.requestSerializer = [AFHTTPRequestSerializer serializer];    self.responseSerializer = [AFJSONResponseSerializer serializer];    return self;}
2. 设置了一些默认值,返回数据的格式之类
/* 1.初始化一个session 2.给manager的属性设置初始值 */- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration {    self = [super init];    if (!self) {        return nil;    }    //设置默认的configuration,配置我们的session    if (!configuration) {        configuration = [NSURLSessionConfiguration defaultSessionConfiguration];    }    //持有configuration    self.sessionConfiguration = configuration;    // 设置为delegate的操作队列并发的线程数量1,也就是串行队列,返回数据    self.operationQueue = [[NSOperationQueue alloc] init];    self.operationQueue.maxConcurrentOperationCount = 1;    /*     -如果完成后需要做复杂(耗时)的处理,可以选择异步队列     -如果完成后直接更新UI,可以选择主队列     [NSOperationQueue mainQueue]     */        self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];    //默认为json解析    self.responseSerializer = [AFJSONResponseSerializer serializer];    //设置默认证书 无条件信任证书https认证    self.securityPolicy = [AFSecurityPolicy defaultPolicy];#if !TARGET_OS_WATCH    //网络状态监听    self.reachabilityManager = [AFNetworkReachabilityManager sharedManager];#endif    //delegate= value taskid = key    self.mutableTaskDelegatesKeyedByTaskIdentifier = [[NSMutableDictionary alloc] init];    //使用NSLock确保线程安全    self.lock = [[NSLock alloc] init];    self.lock.name = AFURLSessionManagerLockName;        //异步的获取当前session的所有未完成的task。其实讲道理来说在初始化中调用这个方法应该里面一个task都不会有    //后台任务重新回来初始化session,可能就会有先前的任务    //https://github.com/AFNetworking/AFNetworking/issues/3499    [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {        for (NSURLSessionDataTask *task in dataTasks) {            [self addDelegateForDataTask:task uploadProgress:nil downloadProgress:nil completionHandler:nil];        }        for (NSURLSessionUploadTask *uploadTask in uploadTasks) {            [self addDelegateForUploadTask:uploadTask progress:nil completionHandler:nil];        }        for (NSURLSessionDownloadTask *downloadTask in downloadTasks) {            [self addDelegateForDownloadTask:downloadTask progress:nil destination:nil completionHandler:nil];        }    }];    return self;}
3. 创建一个NSMutableURLRequest
//1.生成request,2.通过request成成task- (NSURLSessionDataTask *)dataTaskWithHTTPMeth

微信