對(duì)于第三方的用法分析的比較好的博客, 總是有很多, 來源自網(wǎng)絡(luò)匯總!
1. 下載 ?AFNetworking(點(diǎn)我)
2. 需要引入的庫?
- CoreLocation.frameworkGET請(qǐng)求方法
- SystemConfiguration.framework
- MobileCoreServices.framework
- Security.framework
需要在 ARC 的環(huán)境下 - 非 ARC 的工程中 - 請(qǐng)?zhí)砑?-fobjc-arc
3. ? GET和POST請(qǐng)求
#import "AFNetworking.h"
?3.1 GET請(qǐng)求
- (NSURLSessionDataTask *)GET:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
POST請(qǐng)求方法
- (NSURLSessionDataTask *)POST:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
進(jìn)行封裝, 使用的時(shí)候使用相應(yīng)的方法
?封裝內(nèi)部GET方法
+ (void)getDataWithUrl:(NSString *)str completion:(void (^)(NSData *))block
{
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; ?
NSString *path = [NSString stringWithFormat:@"%@/%ld.aa", docPath, [str hash]];? ? ? ? // 利用hash值作為存入本地的文件名,
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; ? // ?設(shè)置管理員
manager.requestSerializer = [AFHTTPRequestSerializer serializer]; // 編碼格式默認(rèn)是?NSUTF8StringEncoding
manager.responseSerializer = [AFHTTPResponseSerializer serializer];?
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[manager GET:str parameters:dic success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"請(qǐng)求成功");
NSString *requsetTmp = [NSString stringWithString:operation.responseString];
NSData *resData = [[NSData alloc] initWithData:[requsetTmp dataUsingEncoding:NSUTF8StringEncoding]];
[resData writeToFile:path atomically:YES];
block(resData);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"請(qǐng)求失敗");
NSData *pickData = [NSData dataWithContentsOfFile:path];
block(pickData);
}];
}
這樣就封裝好了 在外部直接調(diào)用并進(jìn)行數(shù)據(jù)處理
NSString *str = @"https//****************************";
[NetWorkHandle getDataWithUrl:str completion:^(NSData *data) {
NSError *error = nil;
id result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error]
// 處理JSON數(shù)據(jù)
}
3.2 POST請(qǐng)求 一樣
+ (void)postDataWithUrl:(NSString *)str completion:(void(^)(NSData *data))block
{
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//
NSString *path = [NSString stringWithFormat:@"%@/%ld.aa", docPath, [str hash]]; ? ? ? ? // 利用hash值作為存入本地的文件名, ? ?
NSLog(@"%@", path);
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[manager POST:str parameters:dic success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSString *requsetTmp = [NSString stringWithString:operation.responseString];
NSData *resData = [[NSData alloc] initWithData:[requsetTmp dataUsingEncoding:NSUTF8StringEncoding]];
[resData writeToFile:path atomically:YES]; // 寫入本地
block(resData);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"請(qǐng)求失敗");
NSData *pickData = [NSData dataWithContentsOfFile:path]; // 讀取本地
block(pickData);
}];
}
外部使用如GET是一樣的!?
4. 用于監(jiān)聽網(wǎng)絡(luò)狀態(tài)
AFNetworkReachabilityStatusUnknown? ? ? ? ? = -1,? // 未知
AFNetworkReachabilityStatusNotReachable? ? = 0,? // 無連接
AFNetworkReachabilityStatusReachableViaWWAN = 1,? // 3G
AFNetworkReachabilityStatusReachableViaWiFi = 2,? // WiFi
使用?
// 如果要檢測網(wǎng)絡(luò)狀態(tài)的變化,必須用檢測管理器的單例的startMonitoring
[[AFNetworkReachabilityManager ?sharedManager] ?startMonitoring];
若是網(wǎng)絡(luò)中斷, 內(nèi)部會(huì)把網(wǎng)絡(luò)請(qǐng)求的中斷, 自己可以設(shè)置提醒, 若再次連上網(wǎng), AFN會(huì)自動(dòng)進(jìn)行請(qǐng)求;
可以設(shè)置彈窗根據(jù)不同的網(wǎng)絡(luò)狀態(tài)進(jìn)行不同的提示
-(void)alert:(NSString *)message{
UIAlertView *alertView=[[UIAlertView alloc]initWithTitle:@"System Info" message:message delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles: nil];
[alertView show];
}
-(void)checkNetworkStatus{
//創(chuàng)建一個(gè)用于測試的url
NSURL *url=[NSURL URLWithString:@"http://www.apple.com"];
AFHTTPRequestOperationManager *operationManager=[[AFHTTPRequestOperationManager alloc]initWithBaseURL:url];
//根據(jù)不同的網(wǎng)絡(luò)狀態(tài)改變?nèi)プ鱿鄳?yīng)處理?
[operationManager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusReachableViaWWAN:
[self alert:@"2G/3G/4G Connection."];
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
[self alert:@"WiFi Connection."];
break;
case AFNetworkReachabilityStatusNotReachable:
[self alert:@"Network not found."];
break;
default:
[self alert:@"Unknown."];
break;
}
}];
//開始監(jiān)控
[operationManager.reachabilityManager startMonitoring];
}
也可以在這么寫
或者直接使用
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusNotReachable:
[self alert:@"網(wǎng)絡(luò)無連接"];
break;
default:[self handleData];
break;
}
}];
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
開始監(jiān)控, 當(dāng)然第二種簡介方便, 程序啟動(dòng)后只需要啟用一次就可以, 它在不斷的監(jiān)控, 但當(dāng)網(wǎng)絡(luò)改變的時(shí)候,? 可調(diào)用下邊方法了判斷當(dāng)前網(wǎng)絡(luò)
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
一般開始監(jiān)控之后, 在用到判斷網(wǎng)絡(luò)的
AFNetworkReachabilityManager *man =? [AFNetworkReachabilityManager sharedManager]; if (man.networkReachabilityStatus != 0) {
// 做處理
} else {
? ? 按照上邊的幾種state的數(shù)值來 進(jìn)行網(wǎng)絡(luò)處理!
}
5. 下載使用?
+ (void)sessionDownloadWithUrl:(NSString*)urlStrsuccess:(void(^)(NSURL*fileURL))successfail:(void(^)())fail
{
NSURLSessionConfiguration ?*config = [NSURLSessionConfiguration ? ? ? ? ? ? ? ? ? ?defaultSessionConfiguration];
AFURLSessionManager *manager = [ [ AFURLSessionManager alloc] ? ?initWithSessionConfiguration: config];
NSString*urlString = [urlStrstringByAddingPercentEscapesUsingEncoding: ?NSUTF8StringEncoding];
NSURL*url = [NSURLURLWithString:urlString];
NSURLRequest*request = [NSURLRequestrequestWithURL:url];
NSURLSessionDownloadTask*task = [managerdownloadTaskWithRequest:requestprogress:nildestination:^NSURL*(NSURL*targetPath,NSURLResponse*response) {
// 指定下載文件保存的路徑
//? ? ? ? NSLog(@"%@ %@", targetPath, response.suggestedFilename);
// 將下載文件保存在緩存路徑中
NSString*cacheDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask,YES)[0];
NSString*path = [cacheDirstringByAppendingPathComponent:response.suggestedFilename];
// URLWithString返回的是網(wǎng)絡(luò)的URL,如果使用本地URL,需要注意
//? ? ? ? NSURL *fileURL1 = [NSURL URLWithString:path];
NSURL*fileURL = [NSURLfileURLWithPath:path];
//? ? ? ? NSLog(@"== %@ |||| %@", fileURL1, fileURL);
if(success) {
success(fileURL);
}
returnfileURL;
}completionHandler:^(NSURLResponse*response,NSURL*filePath,NSError*error) {
NSLog(@"%@ %@", filePath, error);
if(fail) {
fail();
}
}];
[taskresume];
}
?// ?總結(jié)于網(wǎng)絡(luò) ~~~~ 鏈接
網(wǎng)絡(luò)2-AFNetworking和WebView
另外 對(duì)于AFNetworking的進(jìn)一步使用, 請(qǐng)?jiān)斠娨韵骆溄?來源CocoaChina~~~