AFNetWorking 在IOS開發中是一個常常會用的第三方開源庫,其最好處是維護及時,源碼開源。數組
經常使用GET與POST請求方法:緩存
POST請求:服務器
//初始化一個請求對象 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; NSString * url = @"你的請求地址"; //dic 爲參數字典 [manager POST:url parameters:dic success:^(AFHTTPRequestOperation *operation, id responseObject) { //請求成功的回調 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { //請求失敗的回調 }];
GET請求:oop
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; NSString * url = @"你的請求地址"; [manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { //請求成功的回調 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { //請求失敗的回調 }];
這裏有一個地方須要注意,atom
[AFHTTPRequestOperationManager manager]
這個類方法咱們點進源碼能夠發現:url
+ (instancetype)manager { return [[self alloc] initWithBaseURL:nil]; }
這裏初始化了一個返回了一個新的對象,並非單例。spa
使用這樣的下載方法,下載完成後的數據AFNetWorking會幫咱們自動解析,可是有時候服務器給的數據並不標準,這時咱們須要加上這個設置:code
manager.responseSerializer = [AFHTTPResponseSerializer serializer];對象
這樣咱們將獲得原始的HTTP返回給咱們數據。繼承
咱們再來探究一下,下載成功後,回調方法裏的參數究竟是什麼東西
success:^(AFHTTPRequestOperation *operation, id responseObject)
其中,第二個參數 responseObject 是下載下來的data數據,可直接進行JSON等解析。
第一個參數,是個AFHTTPRequestOperation對象,來看源文件
@interface AFHTTPRequestOperation : AFURLConnectionOperation @property (readonly, nonatomic, strong) NSHTTPURLResponse *response; @property (nonatomic, strong) AFHTTPResponseSerializer <AFURLResponseSerialization> * responseSerializer; @property (readonly, nonatomic, strong) id responseObject; @end
能夠發現,裏面有一個成員即是responseObject,同時,AFHTTPRequestOperation是繼承於AFURLConnectionOperation,咱們在看看AFURLConnectionOperation這個類:
@interface AFURLConnectionOperation : NSOperation <NSURLConnectionDelegate, NSURLConnectionDataDelegate, NSSecureCoding, NSCopying> @property (nonatomic, strong) NSSet *runLoopModes; @property (readonly, nonatomic, strong) NSURLRequest *request; @property (readonly, nonatomic, strong) NSURLResponse *response; @property (readonly, nonatomic, strong) NSError *error; @property (readonly, nonatomic, strong) NSData *responseData; @property (readonly, nonatomic, copy) NSString *responseString; @property (readonly, nonatomic, assign) NSStringEncoding responseStringEncoding; @property (nonatomic, assign) BOOL shouldUseCredentialStorage; @property (nonatomic, strong) NSURLCredential *credential; @property (nonatomic, strong) AFSecurityPolicy *securityPolicy; @property (nonatomic, strong) NSInputStream *inputStream; @property (nonatomic, strong) NSOutputStream *outputStream; @property (nonatomic, strong) dispatch_queue_t completionQueue; @property (nonatomic, strong) dispatch_group_t completionGroup; @property (nonatomic, strong) NSDictionary *userInfo; - (instancetype)initWithRequest:(NSURLRequest *)urlRequest NS_DESIGNATED_INITIALIZER; - (void)pause; - (BOOL)isPaused; - (void)resume;
看到這裏,就離AFNETWorking封裝的源頭很近了,裏面的成員很是多,其中包含了大部分咱們須要的信息,能夠經過點語法取到,其中有輸入輸出流,錯誤信息,請求到的Data數據,以及請求到的字符串數據
responseString
咱們能夠經過
NSLog ( @"operation: %@" , operation. responseString );
來打印查看請求到的原始信息。
幾點注意:
1.關於崩潰url爲nil
大多數這樣的緣由是url中有特殊字符或者中文字符,AFNETWorking並無作UTF8的轉碼,須要:
url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
2.添加HttpHead字段的方法
//爲這個下載任務HTTP頭添加@"User-Agent"字段 [manager.requestSerializer setValue:_scrData forHTTPHeaderField:@"User-Agent"]; //打印頭信息 NSLog(@"%@",manager.requestSerializer.HTTPRequestHeaders);
在下載請求中,常常會請求一些不長變化的數據,若是每次APP啓動都進行請求,會消耗許多資源,而且有時候緩存的處理,能夠大大改善用戶體驗。
在AFNETWorking中,並無提供現成的緩存方案,咱們能夠經過寫文件的方式,自行作緩存。
在下載方法中:
[manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { //寫緩存 NSString *cachePath = @"你的緩存路徑";// /Library/Caches/MyCache [data writeToFile:cachePath atomically:YES]; succsee(data); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { }];
而後在每次下載前,進行以下判斷:
NSString * cachePath = @"你的緩存路徑"; if ([[NSFileManager defaultManager] fileExistsAtPath:cachePath]) { //從本地讀緩存文件 NSData *data = [NSData dataWithContentsOfFile:cachePath]; }
有時,咱們的下載請求多是用戶的動做觸發的,好比一個按鈕。咱們還應該作一個保護機制的處理,
//初始化一個下載請求數組 NSArray * requestArray=[[NSMutableArray alloc]init]; //每次開始下載任務前作以下判斷 for (NSString * request in requestArray) { if ([url isEqualToString:request]) { return; } } [requestArray addObject:url]; //下載成功或失敗後 [manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { [requestArray removeObject:url] } failure:^(AFHTTPRequestOperation *operation, NSError *error) { [requestArray removeObject:url] }];
至此,一個比較完成AFNETWorking請求使用流程就完成了。
專一技術,熱愛生活,交流技術,也作朋友。
——琿少 QQ羣:203317592