AFNetworking 3.x

AFNetworking2.0源码解析<一>

AFNetworking2.0源码解析<二>  --  构建普通请求: 格式化请求参数,生成HTTP Header + 构建multipart请求

How to implement a CoreFoundation toll-free bridged NSInputStream subclass

AFNetworking2.0源码解析<三>  --  HTTPS建立过程+CA防止中间人+SSL Pinning

关于非对称加密算法的原理:RSA算法原理<一><二>

关于整个流程:HTTPS那些事<一><二><三>

关于数字证书:浅析数字证书

AFNetworking源码解析<四>  --  AFURLResponseSerialization(2Method+JSON解析+图片解压)


AFNetworking 2.0

AFNetworking 2.0 Migration Guide

AFNetworking 3.0 Migration Guide

AF好萌~~

AFURLSessionManager

.h  --  NSURLSession + NSOperationQueue,AFURLResponseSerialization + AFSecurityPolicy + AFNetworkReachabilityManager

data/upload/download/Tasks

~~~

.m  --  

队列2 + 常量 + block

AFURLSessionManagerTaskDelegate

init:(upload/downloadProgress)

setupProgressForTask:  --  用upload和download的NSProgress = NSURLSessionTask的属性 + 上传下载KVO

cleanUpProgressForTask:  --  remove KVO

observeValueForKeyPath:ofObject:change:context:  --  触发

URLSession:task:didCompleteWithError: - userInfoDict[ResponseSerializer][AssetPath][ResponseData],(error -- [Error] + 异步主队列completionHandler + CompleteNotification(userInfoDict) ) + 

responseSerializer(默认JSON解析) + [SerializedResponse][Error] + completionHandler + CompleteNotification(userInfoDict)

URLSession:dataTask:didReceiveData: - appendData

URLSession:downloadTask:didFinishDownloadingToURL: - (FinishDownloadingBlock() -> downloadFileURL) + moveItemAtURL:toURL: + error->FailMoveNotification


static inline void af_swizzleSelector & BOOL af_addMethod  --  methodSwizzling

_AFURLSessionTaskSwizzling

+load - 当前类和父类的resume比较+和原始AFResume比较,↓↓↓

+swizzleResumeAndSuspendMethodForClass:  --  MS - af_resume <=> resume & af_suspend <=> suspend

state - StateCanceling

af_resume - [self state] + resume + DidResume通知

af_suspend - [self state] + suspend + DidSuspend通知


AFURLSessionManager

initWithSessionConfiguration:  --  初始化(session+responseSerializer+securityPolicy+reachabilityManager)

taskDidResume && taskDidSuspend:  --  通知方法,同一对象发送的通知->异步主队列DidSuspend/Resume通知

AFURLSessionManagerTaskDelegate - getter - [task.taskIdentifier]=delegate

setter  --  setupProgressForTask(delegate初始化) + addNotificationObserverForTask

addDelegateForData/Upload/DownloadTask:upload/downloadProgress:/destination:completionHandler:

- delegate(各种block/FinishDownloadingBlock) -> setForData/Upload/DownloadTask

removeDelegateForTask: - (delegate cleanUp) + remove通知


(tasks + dataTasks + uploadTasks + downloadTasks) - getter -> tasksForKeyPath([self.session getTasksWithCompletionHandler~~])

invalidateSessionCancelingTasks:  --  session2M


dataTaskWithRequest:uploadProgress:downloadProgress:completionHandler: - 安全创建dataTask -> addDelegateForDataTask

uploadTaskWith/StreamedRequest:fromFile/Data:progress:completionHandler: - 安全创建uploadTask (重新创建) -> appDelegateForUploadTask

downloadTaskWithRequest/ResumeData:progress:destination:completionHandler: - 同


各种setBlock(15)

NSURLSessionDelegate

-URLSession:didBecomeInvalidWithError: - BecomeInvalidBlock + notification

-URLSession:didReceiveChallenge:completionHandler: - i. if --验证挑战Block ->返回disposition   else --服务器信任方法-> (securityPolicy)安全评估->证书验证 

ii. completionBlock(disposition, credential)

NSURLSessionTaskDelegate

-URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler: - HTTP重定向Block + completionBlock

-URLSession:task:didReceiveChallenge:completionHandler: - i. if --验证挑战block ->返回disposition   else --服务器信任方法->安全评估->证书验证

ii. completionBlock(disposition, credential)

-URLSession:task:needNewBodyStream: - if -- streamBlock -> 返回inputStream   else -- HTTPBodyStream存在&&实现协议-> copy  +  completionBlock()

-URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend: - 原始请求头"Content-Length" -> totalUnitCount + DidSendBodyDataBlock()

-URLSession:task:didCompleteWithError: - [delegate URLSession:task:didCompleteWithError:](拼接各种userInfo,通知发送) + removeDelegate + taskDidCompleteBlock

NSURLSessionDataDelegate

-URLSession:dataTask:didReceiveResponse:completionHandler: - DidReceiveResponseBlock + completionBlock

-URLSession:dataTask:didBecomeDownloadTask: - remove-dataTask + set-downloadTask + becomeDownloadTaskBlock()

-URLSession:dataTask:didReceiveData: - delegate的didReceiveData(appendData) + receiveDataBlock()

-URLSession:dataTask:willCacheResponse:completionHandler: - cacheResponseBlock() + completionBlock

-URLSessionDidFinishEventsForBackgroundURLSession: - 异步主队列(后台session完成事件block)

NSURLSessionDownloadDelegate

-URLSession:downloadTask:didFinishDownloadingToURL: - (DidFinishDownloadingBlock -> fileURL) + moveItemAtURL:toURL: + FailMoveNotification  +  delegate类似方法(downloadFileURL + FailMoveNotification)

-URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite: - DidWriteDataBlock

-URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes: - DidResumeBlock

NSSecureCoding  --  sessionConfig的编解码

NSCopying 



AFHTTPSessionManager

.h  --  

.m  --  

initWithBaseURL:sessionConfiguration:  --  url + 请求响应Serializer

Request & ResponseSerializer - setter


GET:parameters:/progress:success:failure: **

HEAD:parameters:success:failure: **

POST:parameters:/progress:success:failure: **

❤❤❤ POST:parameters:constructingBodyWithBlock:/progress:success:failure: - i. requestSerializer(组装AFHTTPBodyPart + HTTPBodyStream + HeaderField) + (nil OR failureBlock) 

ii. 父类StreamedRequest:(安全创建uploadTask -> addDelegateForUploadTask)

PUT:parameters:success:failure: **

PATCH:parameters:success:failure: **

DELETE:parameters:success:failure: **

❤❤❤ dataTaskWithHTTPMethod:URLString:parameters:uploadProgress:
downloadProgress:success:failure:
- i. requestSerializer(请求前的配置- (url + HTTPMethod) + (现有ObservedKeyPaths -> [request setValue: forKey:]) + HTTPHeaderField +通过parameters转换为queryString + HTTPMethod做不同设置 ) + (nil OR failureBlock)

ii. ->父类dataTaskWithRequest:(安全创建uploadTask -> addDelegateForUploadTask)

NSSecureCoding  --  编解码5

NSCopying




iOS. PercentEscape是错用的URLEncode,看看AFN和Facebook吧

苹果的编码 != URLEncode

(1)当遇到发送网络请求的参数中有汉字的情况,使用stringByAddingPercentEscapesUsingEncoding:进行转义,这样带有汉字的urlString就会将每个汉字转成相应的unicode编码对应的3个%形式,这叫urlEncode(每个能写后端的语言都有的方法),但是苹果的stringByAddingPercentEscapesUsingEncoding:却不是urlEncode

&不会转码 - 产生这种情况的原因是:百分号转义不等于URLEncode,该编码不同于URL编码,由于不会对&字符编码,因此不会改变URL参数的分隔。URL编码会编码&、?与其他标点符号

(2)iOS 7.0 - stringByAddingPercentEncodingWithAllowedCharacters: 需要传递一个参数:这个参数是一个字符集,表示:在进行转义过程中,不会对这个字符集中包含的字符进行转义,而保持原样保留下来。

[NSCharacterSet  letterCharacterSet] 来保证字母不被转义

MORE:遇到queryString中的表单域也需要转义的情况 - person[contact] = 13801001234

[mutableCharSet addCharactersInString:@"[]"];

(3)AFN

GET:@"https://www.baidu.com/s"

parameters:@{@"ie":@"UTF-8",@"wd":@"汉字&ss"};

success:nil   failure:nil

AFN对queryString的组装是这样进行的:

AFN会将parameters传递的字典通过将每个表单元素的 field 和 value 进行 urlcode 之后拼接,然后再直接附加在传递的URLString后面(当然,如果是POST方式就不是附加了,而是将拼好的串放到HTTP body中)。

(4) AFN URLEncode - 将字典转为queryString的模块

- 请求前:构建request的header和queryString、uploadContent和配置(如超时等),这部分的功能在AFURLRequestSerialization中

- 请求中:分别有基于NSURLConnection的访问(3.0移除)和基于NSURLSession的访问模块

- 请求后:错误处理 OR 成功处理:数据格式转换和解析,主要在AFURLResponseSerialization中

NSArray* AFQueryStringPairsFromKeyAndValue(NSString*key, id value);

<1> 利用AFQueryStringPairsFromKeyAndValue函数将parameters字典中的每个key-value对取出,将每个key-value对构建为AFQueryStringPair对象,放到一个数组中。

<2> 在AFQueryStringFromParameters方法内部遍历这个数组(每个元素为AFQueryStringPair对象),使用AFQueryStringPair类的转义方法 URLEncodedStringValue 将 AFQueryStringPair 转为字符串,将这些字符串存入新的数组中。这样新数组中的每个元素就是转义之后的field=value字符串,最后用&将数组元素连接即可。

NSString* AFPercentEscapedStringFromString(NSString*string)

(5)queryString转为字典的需求

Facebook的facebook-ios-sdk

+ (NSDictionary*)dictionaryWithQueryString:(NSString*)queryString; 

+ (NSString*)URLDecode:(NSString*)value;




AFURLRequestSerialization

.h  --  

AFPercentEscapedStringFromString() + AFQueryStringFromParameters()

@protocol - requestBySerializingRequest:withParameters:error:

AFHTTPRequestSerializer

+serializer

- HTTPHeaderField setter & getter

- AuthorizationHeaderField

- requestWithMethod:URLString:parameters:error:

multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:error:

- requestWithMultipartFormRequest:writingStreamContentsToFile:completionHandler:

@protocol AFMultipartFormData - 7

AFJSONRequestSerializer

AFPropertyListRequestSerializer


.m  --  

AFPercentEscapedStringFromString - allowCharacterSet中移除编码字符+ stringByAddingPercentEncodingWithAllowedCharacters

AFQueryStringPair

- initWithField:value:

- URLEncodedStringValue -> AFPercentEscapedStringFromString(NSString *string) = habit%5B%5D=%E6%B8%B8%E6%B3%B3


通过parameters转换为queryString AFQueryStringFromParameters(URLEncodedStringValue) -> AFQueryStringPairsFromDictionary -> AFQueryStringPairsFromKeyAndValue(组装NSArray,内部是AFQueryStringPair对象)

AFHTTPRequestSerializerObservedKeyPaths - 单例ObservedKeyPaths = @[allowsCellularAccess, cachePolicy, HTTPShouldHandleCookies/UsePipelining, networkServiceType, timeoutInterval]

AFHTTPRequestSerializer

-init  -  "Accept-Language"/User-Agent HeaderField + HTTP Method + 观察ObservedKeyPaths中属性

allowsCellularAccess/cachePolicy/HTTPShouldHandleCookies/UsePipelining/networkServiceType/timeoutInterval 手动触发KVO

HTTPRequestHeaders setter & getter

-setAuthorizationHeaderFieldWithUsername:password: - NSData(NSString) -> NSString(NSData base64) -> setHTTPRequestHeaders

- requestWithMethod:URLString:parameters:error: - (url + HTTPMethod)  + 现有ObservedKeyPaths -> [request setValue: forKey:] + (HTTPHeaderField +通过parameters转换为queryString + HTTPMethod做不同设置)

-multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:error:

AFStreamingMultipartFormData + (pair.value -> data +组装AFHTTPBodyPart) + block,first&last设置YES + HTTPBodyStream + Content-Type/-Length HeaderField

-requestWithMultipartFormRequest:writingStreamContentsToFile:completionHandler: - ioStream - (read:maxLength: & write:maxLength:)

-requestBySerializingRequest:withParameters:error: - HTTPHeaderField +通过parameters转换为queryString + HTTPMethod做不同设置

NSKeyValueObserving - 在ObservedKeyPaths中手动调用 + 收到KVO,非NSNull->add

NSSecureCoding - mutableHTTPRequestHeaders & queryStringSerializationStyle的编解码

NSCopying


AFCreateMultipartFormBoundary - @"Boundary+%08X%08X"

AFMultipartFormInitial/Encapsulation/FinalBoundary - ~~

AFContentTypeForPathExtension - 通过pathExtension返回contentType

AFHTTPBodyPart

-init -> transitionToNextPhase - - (runloop&open + close)

-inputStream - 根据body类型设置_inputStream(set是.body=~, get是.inputStream)

-stringForHeaders - headers的(key: value/r/n ~~~)组成的string

-contentLength - AFHTTPBodyPart的contentLength = (2BoundaryData+headersData+_bodyContentLength)

-hasBytesAvailable - 根据streamStatus返回是否可用

-read:maxLength: - _phase->(2BoundaryData+HeaderData) -> ↓↓↓

-readData:intoBuffer:maxLength: - [data getBytes:buffer range:range] + _phaseReadOffset + NextPhaseIfNeed

NSCopying

AFMultipartBodyStream

-initWithStringEncoding:

-setInitialAndFinalBoundaries - first&last设置YES

-read:maxLength: - [HTTPBodyPart read:maxLength:]

-open - (statusOpen + boundaryYES + Enumerator)

NSCopying - 内部AFHTTPBodyPart copy + BoundaryYES

AFStreamingMultipartFormData

-initWithURLRequest:stringEncoding:

-appendPartWithFileURL:name:error: - fileName+mimeType -> ↓↓↓

-appendPartWithFileURL:name:fileName:mimeType:error: - (不是fileURL ||返回是否URL's资源存在且可达) -> error(userInfo)  +  拼接AFHTTPBodyPart(Headers=(key:Content-Disposition/-Type value:~)+length=fileAttributes[NSFileSize])

-appendPartWithInputStream:name:fileName:length:mimeType: - 拼接AFHTTPBodyPart(Headers=(key:Content-Disposition/-Type value:~)

-appendPartWithFileData:name:fileName:mimeType:(2Headers+data) -> **

-appendPartWithFormData:name:(Headers+data) -> appendPartWithHeaders:body:(组装AFHTTPBodyPart) - **

-requestByFinalizingMultipartFormData  - first&last设置YES + HTTPBodyStream + Content-Type/-Length HeaderField


AFJSONRequestSerializer

-requestBySerializingRequest:withParameters:error: - @"GET", @"HEAD", @"DELETE"其中之一-> [super ~~]  OR  (HTTPRequestHeaders -> mutableRequestHeaders) + (hasParameters -> JSON头+HTTPBody:JSON数据)

NSSecureCoding - writingOptions的编解码

NSCopying

AFPropertyListRequestSerializer

-requestBySerializingRequest:withParameters:error: - @"GET", @"HEAD", @"DELETE"其中之一-> [super ~~]  OR  (HTTPRequestHeaders -> mutableRequestHeaders) + (hasParameters -> x-plist头+HTTPBody:PList数据)

NSSecureCoding - format&writeOptions的编解码

NSCopying




AFURLResponseSerialization

.h  --  

@protocol - responseObjectForResponse:data:error:

AFHTTPResponseSerializer

+serializer 

-validateResponse:data:error:  --  验证响应是否有效

AFJSONResponseSerializer

+serializerWithReadingOptions:

AFXMLParserResponseSerializer

AFPropertyListResponseSerializer

+serializerWithFormat:readOptions:

AFImageResponseSerializer

AFCompoundResponseSerializer

+compoundSerializerWithResponseSerializers:

.m  --  

AFErrorWithUnderlyingError

AFErrorOrUnderlyingErrorHasCodeInDomain

AFJSONObjectByRemovingKeysWithNullValues - 递归

AFHTTPResponseSerializer

NSSecureCoding - acceptableStatusCodes & acceptableContentTypes的编解码

NSCopying


AFJSONResponseSerializer

-init - @"application/json",@"text/json",@"text/javascript"

-responseObjectForResponse:data:error: - 响应有效性 + (length > 0 && 非空格=>解析) + 去(key - value:(nil OR NSNull)) + 返回

NSSecureCoding - readingOptions & removesKeysWithNullValues的编解码

NSCopying


AFXMLParserResponseSerializer

-init - @"application/xml",@"text/xml"

-responseObjectForResponse:data:error: - 响应有效性 + NSXMLParserWithData


AFPropertyListResponseSerializer

-init - @"application/x-plist"

-responseObjectForResponse:data:error: - 响应有效性 + data ->解析 + 返回

NSSecureCoding - format & readOptions的编解码

NSCopying


UIImage (AFNetworkingSafeImageLoading)

+af_safeImageWithData - 单例锁+锁imageWithData


AFImageWithDataAtScale - 安全初始化 + 动图返回 + 初始化withScale

AFInflatedImageFromResponseWithDataAtScale - 解码图片

AFImageResponseSerializer

-init - @"image/tiff ~~~"

-responseObjectForResponse:data:error: - 响应有效性 + AFInflatedImageFromResponseWithDataAtScale解码图片 OR AFImageWithDataAtScale创建

NSSecureCoding - imageScale & automaticallyInflatesResponseImage的编解码

NSCopying


AFCompoundResponseSerializer

-responseObjectForResponse:data:error: - 遍历验证响应 OR 返回super

NSSecureCoding - responseSerializers的编解码

NSCopying



AFSecurityPolicy - 封装了证书验证的过程

.h  --  系统信任CA机构列表验证 + SSL Pinning

+certificatesInBundle:

+defaultPolicy

+policyWithPinningMode:withPinnedCertificates:

-evaluateServerTrust:forDomain:

.m  --  

AFSecKeyIsEqualToKey - isEqual:

AFPublicKeyForCertificate - certificateData->PublicKey

AFServerTrustIsValid - SecTrustEvaluate -> Unspecified && Proceed

AFCertificateTrustChainForServerTrust - 遍历serverTrust的SecCertificateRef —>拿Data - [trustChain add:certificateData]

AFPublicKeyTrustChainForServerTrust - 遍历serverTrust的(SecCertificateRef+policy+SecTrustRef) -> (trust+&result) -> [trustChain add:copy(publicKey)]

AFSecurityPolicy

+certificatesInBundle: - (本地.cer - [certificatesSet add:certificateData])

+defaultPinnedCertificates - 单例 + ↑↑↑

+defaultPolicy - 验证域名+ None

+policyWithPinningMode:withPinnedCertificates: - SSLPinningMode + ↓↓↓

+setPinnedCertificates: - 由本地的pinnedCertificates(cerNSData) -> AFPublicKeyForCertificate() = pinnedPublicKeys

-evaluateServerTrust:forDomain: - if + (验证域名=SSL->SecTrustSetPolicies) + ~ + Certificate -> (本地或外设pinnedCertificates(cerData)->SecCertificateCreateWithData()->MArray=AnchorCers AND AFServerTrustIsValid()->= serverTrust(CertificateData))  

PublicKey -> serverTrust的cer对应的publicKeys AND 本地pinnedPublicKey =有一个相等

NSSecureCoding - SSLPinningMode&allowInvalidCertificates&validatesDomainName&pinnedCertificates的编解码

copyWithZone


AFNetworkReachabilityManager

.h  --  

+manager

+managerForDomain/Address:

-initWithReachability:

-startMonitoring / stopMonitoring

.m  --  

AFStringFromNetworkReachabilityStatus - 网络status返回description

AFNetworkReachabilityStatusForFlags - SCNetworkFlags各种& -> AFNetworkStatus

AFPostReachabilityStatusChange - flags->status +异步主队列(block +通知(userInfo:status))

AFNetworkReachabilityManager

+sharedManager: - +manager(address)->managerForAddress:

+managerForDomain: - domain->reachability->manager

+managerForAddress: - address->reachability->manager

+manager: - address -> ↑↑↑

-initWithReachability: - 网络可达&状态

-startMonitoring: - callback(设置status +回调StatusBlock(status)) -> (context -> setCallback(Callback) -> runloop)

异步后台SCNetworkGetFlags->AFPostStatusChange(status->post通知)

-stopMonitoring: - SCNetworkReachabilityUnscheduleFromRunLoop()

-keyPathsForValuesAffectingValueForKey: - 当reachable+reachableViaWWAN+reachableViaWiFi发生变化,被认为networkReachabilityStatus发生变化,发出通知




AFAutoPurgingImageCache

.h --  

@protocol - AFImageCache

-addImage:withIdentifier:

removeImageWithIdentifier:

removeAllImages:

imageWithIdentifier:

@protocol - AFImageRequestCache

addImage:forRequest:withAdditionalIdentifier:

removeImageforRequest:withAdditionalIdentifier:

imageforRequest:withAdditionalIdentifier:

AFAutoPurgingImageCache

initWithMemoryCapacity:preferredMemoryCapacity:

.m  --  

AFCachedImage = Model

initWithImage:identifier:

AFAutoPurgingImageCache - cachedImagesDict

initWithMemoryCapacity:preferredMemoryCapacity: - 初始化+并发队列+内存警告removeAll通知

addImage:withIdentifier: - i. 阻塞异步i.并发队列-判断previous+(cachedImages+currentMemoryUsage)Add  ii. 自动清除最早时间图片-拿cachedImagesDict的所有values(images)按lastAccessDate排序-> remove +减少currentMemoryUsage

removeImageWithIdentifier/AllImages: - 阻塞同步并发队列- removeObjectForKey/AllObjects

imageCacheKeyFromURLRequest:withAdditionalIdentifier: - request.URL.absoluteString


AFImageDownloader  

--  NSURLCache + AFAutoPurgingImageCache

.h  --  

AFImageDownloadReceipt

AFImageDownloader

initWithSessionManager:downloadPrioritization:maximumActiveDownloads:imageCache:

-downloadImageForURLRequest:/withReceiptID:success:failure:

-cancelTaskForImageDownloadReceipt:

.m  --  

AFImageDownloaderResponseHandler - uuid + successBlock + failureBlock

-initWithUUID:success:failure:

AFImageDownloaderMergedTask - URLIdentifier + identifier + task +responseHandlersArray

-initWithURLIdentifier:identifier:task:

AFImageDownloadReceipt - task + receiptID

-initWithReceiptID:task:

AFImageDownloader

+defaultURLCache(内存缓存20M + 磁盘缓存150M)

+defaultURLSessionConfiguration(各种配置+defaultURLCache)

-init(defaultConfiguration + AFImageResponseSerializer ->> sessionManager + AFAutoPurgingImageCache) ---------> initWithSessionManager:downloadPrioritization:maximumActiveDownloads:imageCache - 各种+串行&并发队列

+defaultInstance - init

URLCache -> SessionConfig -> SessionManager -> AFImageDownloader

-downloadImageForURLRequest:withReceiptID:success:failure: - 同步串行( 1.取现存的mergedTask,拼接responseHandler -> add,return task 

2. 如果缓存策略允许,尝试从图片缓存加载图片,!=nil & success ->异步主队列回调  

3. 通过AFHTTPSessionManager创建dataTask)  --> 异步并发队列(成功 -> 同步串行removeMergedTask,error - 遍历mergedTask.responseHandlersArray(异步主队列回调所有handler.failureBlock),noError -缓存图片 + 遍历(异步主队列回调所有hander.successBlock)

同步串行ActiveTaskCount--  +  同步串行-出队列==suspend -> resume)

4. 获得createdTask,拼接handler->拼接mergedTask(add拼接handler) -> mergedTasks[key:URLIdentifier value:mergedTask]

5. 开始mergedTask OR入队mergedTask --- return task

6. return拼接receipt

-cancelTaskForImageDownloadReceipt

同步串行(1. 拿mergedTask.responseHandlers中是否有uudi==imageDownloadReceipt.receiptID 

2. Found -> remove +拼接error(userInfo) ->异步主队列回调failureBlock)

3. 收尾检查,handlers==0 & state == suspend -> taskCancel + removeFromMergedTask

-enqueueMergedTask: - 出队列是firstObject,FIFO -加后面,LIFO -加前面

-dequeueMergedTask - 数组当队列,firstObj + removeObj


AFNetworkActivityIndicatorManager  --  任务数控制�活动器

.h  --  

各种set + update - 4

- increment/decrementActivityCount - 赋值(手动调用KVO) +更新

.m  --  

-init - resume/suspend/completeNotification对应方法 -> +-ActivityCount

+sharedManager - init = resume/suspend/completeNotification - 通知方法: networkRequestDidStart&networkRequestDidFinish -- ↓↓↓

-incrementActivityCount & -decrementActivityCount - 赋值(手动调用KVO) +更新

-setEnabled: - =NO -> StateNotActive

-setCurrentState: - NotActive(cancel2+关闭) + DelayingStart(+1s回调Active&NotActive) + Active(cancel1+打开) + DelayingEnd(+0.17回调NotActive)

-updateCurrentStateForNetworkActivityChange: - NotActive(未激活&&有活动=延迟开始) + Active(激活&&没有活动=延迟结束) + DelayingEnd(延迟结束&&有活动=激活)

-startActivationDelayTimer: + activationDelayTimerFired - (定时器1s -> runloop) => (活动数>0 - setState:Active - NotActive) + 活动数>0 - setState:Active - NotActive

-startCompletionDelayTimer: + completionDelayTimerFired - (定时器0.17s -> runloop) => (setState:NotActive) + completion == NotActive

-setNetworkActivityIndicatorVisible: - 赋值(手动调用KVO) + 更新(IndicatorVisible)


UIButton+AFNetworking  --  缓存+下载

.h  --  

- setImageForState:withURLRequest:placeholderImage:success:failure:

- setBackgroundImageForState:withURLRequest:placeholderImage:success:failure:

.m  --  

UIButton (_AFNetworking)

af_imageDownloadReceipt - 关联对象 getter & setter(key是各种state)

af_setBackgroundImageDownloadReceipt - 关联对象 getter & setter(key是各种state)

UIButton (AFNetworking)

ImageDownloader- 关联对象 getter & setter

- setImageForState:withURLRequest:placeholderImage:success:failure: --  缓存+下载

- setBackgroundImageForState:withURLRequest:placeholderImage:success:failure:          --  缓存+下载 


UIImageView+AFNetworking  --  缓存+下载

.h  --  

- setImageWithURLRequest:placeholderImage:success:failure:

.m  --  

UIImageView (_AFNetworking)

af_activeImageDownloadReceipt - 关联对象 getter & setter

UIImageView (AFNetworking)

sharedImageDownloader - 关联对象 getter & setter

- cancelImageDownloadTask -> cancelTaskForImageDownloadReceipt:(ImageDownloader)

- setImageWithURLRequest:placeholderImage:success:failure:  --  缓存+下载


UIProgressView+AFNetworking  --  根据task数据做相应progress

.h  --  

-setProgressWithUpload/DownloadProgressOfTask:animated:

.m  --

af_uploadProgressAnimated & af_downloadProgressAnimated关联对象

-setProgressWithUploadProgressOfTask:animated:  --  (KVO task的"state""countOfBytesSent"属性) + af_setUploadProgressAnimated(保存动画BOOL)

-setProgressWithDownloadProgressOfTask:animated:  --  (KVO task的"state""countOfBytesReceived"属性) + af_setDownloadProgressAnimated(保存动画BOOL)

-observeValueForKeyPath:ofObject:change:context:  --  (context -> keyPath) -> 异步主队列 - set:比例 animated:af_uploadProgressAnimated  OR  异步主队列 - set:比例animated:af_downloadProgressAnimated  OR  完成态state -> removeStateObserver + context(对应observer)


UIActivityIndicatorView+AFNetworking -- 任务状态开始结束动画

.h  --

- setAnimatingWithStateOfTask:

.m  --

UIActivityIndicatorView (AFNetworking) - 持有Observer对象

-af_notificationObserver - notificationObserver懒加载

-setAnimatingWithStateOfTask:  --  af_notificationObserver~~

AFActivityIndicatorViewNotificationObserver

-initWithActivityIndicatorView:

-setAnimatingWithStateOfTask:  --  (=running->start  OR  stop)  + 通知 - 对应方法↓↓

-af_startAnimating  --  异步主队列startAnimating

-af_stopAnimating  --  异步主队列stopAnimating


UIRefreshControl+AFNetworking

.h  -- 

-setRefreshingWithStateOfTask:

.m  --  

UIRefreshControl (AFNetworking) - 持有Observer对象

-af_notificationObserver - notificationObserver懒加载

-setAnimatingWithStateOfTask:  --  af_notificationObserver~~

AFActivityIndicatorViewNotificationObserver

-initWithActivityIndicatorView:

-setRefreshingWithStateOfTask:  --  (=running->start  OR  stop)  + 通知 - 对应方法↓↓

-af_beginRefreshing  --  异步主队列beginRefreshing

-af_endRefreshing  --  异步主队列endRefreshing


UIWebView+AFNetworking

.h  --  

- loadRequest:progress:success:failure: - ↓↓↓ success: (响应的textEncodingName -> CFStringEncoding -> NSStringEncoding) + (有success前向回调successBlock(response, HTMLString) )

- loadRequest:MIMEType:textEncodingName:progress:success:failure: - (running || suspend -> cancel) + dataTask = (success一直前向回调successBlock + (系统方法loadData + delegate方法) + error一直前向回调failureBlock) + *progress = (taskIdentifier对应delegate.downloadProgress)

.m  --

UIWebView (_AFNetworking)

af_URLSessionTask关联对象

UIWebView (AFNetworking)

-sessionManager  --  return 关联对象 OR 单例

sessionManager关联对象

-responseSerializer  --  return 关联对象 OR 单例

responseSerializer关联对象

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容