qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          IOS網絡訪問之使用AFNetworking

            AFNetworking是IOS上常用的第三方網絡訪問庫,我們可以在github上下載它,同時github上有它詳細的使用說明,最新的AFNetworing2.0與1.0有很大的變化,這里僅對2.0常用的使用方法進行總結
            基于NSURLConnection的API
            提交GET請求
            AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
            [manager GET:@"http://example.com/resources.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
            NSLog(@"JSON: %@", responseObject);
            } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"Error: %@", error);
            }];
            AFResponseSerializer
            上面代碼中responseObject代表了返回的值,當網絡返回json或者xml之類的數據時,它們的本質都是字符串,我們需要通過一定操作才能把字符串轉成希望的對象,AFNetWorking通過設置AFHTTPRequestOperationManager對象的responseSerializer屬性替我們做了這些事。
            如果返回的數據時json格式,那么我們設定
            manager.responseSerializer = [[AFJSONResponseSerializer alloc] init],responseObject就是獲得的json的根對象(NSDictionary或者NSArray)
            如果返回的是plist格式我們就用AFPropertyListResponseSerializer解析器
            如果返回的是xml格式我們就用AFXMLParserResponseSerializer解析器,responseObject代表了NSXMLParser對像
            如果返回的是圖片,可以使用AFImageResponseSerializer
            如果只是希望獲得返回二進制格式,那么可以使用AFHTTPResponseSerializer
            AFRequestSerializer
            AFHTTPRequestOperationManager還可以通過設置requestSeializer屬性設置請求的格式
            有如下的請求地址與參數
            NSString *URLString = @"http://example.com";
            NSDictionary *parameters = @{@"foo": @"bar", @"baz": @[@1, @2, @3]};
            我們使用AFHTTPRequestSerializer的GET提交方式
            [[AFHTTPRequestSerializer serializer] requestWithMethod:@"GET" URLString:URLString parameters:parameters error:nil];
            GET http://example.com?foo=bar&baz[]=1&baz[]=2&baz[]=3
            我們使用AFHTTPRequestSerializer的POST提交方式
            [[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters];
            POST http://example.com/
            Content-Type: application/x-www-form-urlencoded
            foo=bar&baz[]=1&baz[]=2&baz[]=3
            我們使用AFJSONRequestSerializer
            [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters];
            POST http://example.com/
            Content-Type: application/json
            {"foo": "bar", "baz": [1,2,3]}
            默認提交請求的數據是二進制(AFHTTPRequestSerializer)的,返回格式是JSON(AFJSONResponseSerializer)
          提交POST請求
          AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
          NSDictionary *parameters = @{@"foo": @"bar"};
          [manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
          NSLog(@"JSON: %@", responseObject);
          } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
          NSLog(@"Error: %@", error);
          }];
            提交POST請求時附帶文件
          AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
          NSDictionary *parameters = @{@"foo": @"bar"};
          NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"];
          [manager POST:@"http://example.com/resources.json" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
          [formData appendPartWithFileURL:filePath name:@"image" error:nil];
          } success:^(AFHTTPRequestOperation *operation, id responseObject) {
          NSLog(@"Success: %@", responseObject);
          } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
          NSLog(@"Error: %@", error);
          }];
            也可以通過appendPartWithFileData上傳NSData數據的文件
            AFHTTPRequestOperation
            除了使用AFHTTPRequestOperationManager訪問網絡外還可以通過AFHTTPRequestOperation,AFHTTPRequestOperation繼承自AFURLConnectionOperation,
            AFURLConnectionOperation繼承自NSOperation,所以可以通過AFHTTPRequestOperation定義了一個網絡請求任務,然后添加到隊列中執行。
          NSMutableArray *mutableOperations = [NSMutableArray array];
          for (NSURL *fileURL in filesToUpload) {
          NSURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
          [formData appendPartWithFileURL:fileURL name:@"images[]" error:nil];
          }];
          AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
          [mutableOperations addObject:operation];
          }
          NSArray *operations = [AFURLConnectionOperation batchOfRequestOperations:@[...] progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) {
          NSLog(@"%lu of %lu complete", numberOfFinishedOperations, totalNumberOfOperations);
          } completionBlock:^(NSArray *operations) {
          NSLog(@"All operations in batch complete");
          }];
          [[NSOperationQueue mainQueue] addOperations:operations waitUntilFinished:NO];
            批量任務處理
          NSMutableArray *mutableOperations = [NSMutableArray array];
          for (NSURL *fileURL in filesToUpload) {
          NSURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
          [formData appendPartWithFileURL:fileURL name:@"images[]" error:nil];
          }];
          AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
          [mutableOperations addObject:operation];
          }
          NSArray *operations = [AFURLConnectionOperation batchOfRequestOperations:@[...] progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) {
          NSLog(@"%lu of %lu complete", numberOfFinishedOperations, totalNumberOfOperations);
          } completionBlock:^(NSArray *operations) {
          NSLog(@"All operations in batch complete");
          }];
          [[NSOperationQueue mainQueue] addOperations:operations waitUntilFinished:NO];
            上面的API是基于NSURLConnection,IOS7之后AFNetWorking還提供了基于NSURLSession的API
            基于NSURLSession的API
            下載任務
          NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
          AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
          NSURL *URL = [NSURL URLWithString:@"http://example.com/download.zip"];
          NSURLRequest *request = [NSURLRequest requestWithURL:URL];
          NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
          NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
          return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
          } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
          NSLog(@"File downloaded to: %@", filePath);
          }];
          [downloadTask resume];
            文件上傳任務
          NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
          AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
          NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"];
          NSURLRequest *request = [NSURLRequest requestWithURL:URL];
          NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"];
          NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromFile:filePath progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
          if (error) {
          NSLog(@"Error: %@", error);
          } else {
          NSLog(@"Success: %@ %@", response, responseObject);
          }
          }];
          [uploadTask resume];
            帶進度的文件上傳
          NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
          [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"file://path/to/image.jpg"] name:@"file" fileName:@"filename.jpg" mimeType:@"image/jpeg" error:nil];
          } error:nil];
          AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
          NSProgress *progress = nil;
          NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
          if (error) {
          NSLog(@"Error: %@", error);
          } else {
          NSLog(@"%@ %@", response, responseObject);
          }
          }];
          [uploadTask resume];
          NSURLSessionDataTask
          NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
          AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
          NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"];
          NSURLRequest *request = [NSURLRequest requestWithURL:URL];
          NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
          if (error) {
          NSLog(@"Error: %@", error);
          } else {
          NSLog(@"%@ %@", response, responseObject);
          }
          }];
          [dataTask resume];
            查看網絡狀態
            蘋果官方提供Reachablity用來查看網絡狀態,AFNetWorking也提供這方面的API
          NSURL *baseURL = [NSURL URLWithString:@"http://example.com/"];
          AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL];
          NSOperationQueue *operationQueue = manager.operationQueue;
          [manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
          switch (status) {
          case AFNetworkReachabilityStatusReachableViaWWAN:
          case AFNetworkReachabilityStatusReachableViaWiFi:
          [operationQueue setSuspended:NO];
          break;
          case AFNetworkReachabilityStatusNotReachable:
          default:
          [operationQueue setSuspended:YES];
          break;
          }
          }];
          //開始監控
          [manager.reachabilityManager startMonitoring];
          English »
           
          Text-to-speech function is limited to 100 characters

          posted on 2014-12-11 23:44 順其自然EVO 閱讀(28240) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2014年12月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 乌兰察布市| 宜宾县| 闽侯县| 吉木萨尔县| 岳普湖县| 巧家县| 大兴区| 驻马店市| 西青区| 庐江县| 潢川县| 揭西县| 玉树县| 焉耆| 五大连池市| 鲁甸县| 大邑县| 钟山县| 枣阳市| 繁昌县| 崇义县| 龙泉市| 金秀| 昭平县| 万安县| 明星| 姚安县| 临泉县| 化隆| 鄱阳县| 嘉黎县| 武鸣县| 凤山市| 定陶县| 阿鲁科尔沁旗| 桃园县| 南汇区| 井冈山市| 巴塘县| 大荔县| 元朗区|