#import <MobileCoreServices/MobileCoreServices.h>php
#import <SystemConfiguration/SystemConfiguration.h>html
AFN——AFHTTPClientjson
// 關於暫停和繼續,AFN中的數據不是線程安全的安全
// 若是使用操做的暫停和繼續,會使得數據發生混亂服務器
// 不建議使用此功能。網絡
// 有關暫停和後臺下載的功能,NSURLSession中會介紹。多線程
if (_downloadOperation.isPaused) {app
[_downloadOperationresume];框架
} else {ide
[_downloadOperationpause];
}
AFNetworkReachabilityStatusNotReachable = 0, 未鏈接
AFNetworkReachabilityStatusReachableViaWWAN = 1, 3G
AFNetworkReachabilityStatusReachableViaWiFi = 2, 無線鏈接
// 1. AFNetwork 是根據是否可以鏈接到baseUrl來判斷網絡鏈接狀態的
// 提示:最好使用門戶網站來判斷網絡鏈接狀態。
NSURL *url = [NSURLURLWithString:@"http://www.baidu.com"];
AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:url];
_httpClient = client;
[_httpClientsetReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
// 之因此區分無線和3G主要是爲了替用戶省錢,省流量
// 若是應用程序佔流量很大,必定要提示用戶,或者提供專門的設置,僅在無線網絡時使用!
switch (status) {
caseAFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"無線網絡");
break;
caseAFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"3G網絡");
break;
caseAFNetworkReachabilityStatusNotReachable:
NSLog(@"未鏈接");
break;
caseAFNetworkReachabilityStatusUnknown:
NSLog(@"未知錯誤");
break;
}
}];
加載JSON
官方建議AFN的使用方法
1. 定義一個全局的AFHttpClient:包含有
1> baseURL
2> 請求
3> 操做隊列 NSOperationQueue
2. 由AFHTTPRequestOperation負責全部的網絡操做請求
// 1. NSURLRequest
NSURLRequest *request = [_httpClientrequestWithMethod:@"GET"path:@"videos.php?format=json"parameters:nil];
// 2. 鏈接
AFJSONRequestOperation *op = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, NSArray *JSON) {
// 成功以後,直接使用反序列化出來的結果便可。
NSLog(@"%@", JSON);
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
// 1> 網絡訪問獲取數據出錯
// 2> JSON的反序列化出錯
NSLog(@"%@ %@", error, JSON);
}];
// 3. 將操做添加到隊列,開始多線程操做
// 將操做添加到隊列或者start,操做就會啓動
[_httpClient.operationQueueaddOperation:op];
// [_queue addOperation:op];
// [op start];
上傳圖像
/*
此段代碼若是須要修改,能夠調整的位置
1. 把upload.php改爲網站開發人員告知的地址
2. 把file改爲網站開發人員告知的字段名
*/
// 1. httpClient->url
// 2. 上傳請求POST
NSURLRequest *request = [_httpClientmultipartFormRequestWithMethod:@"POST"path:@"upload.php"parameters:nilconstructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
// 在此位置生成一個要上傳的數據體
// form對應的是html文件中的表單
/*
參數
1. 要上傳的[二進制數據]
2. 對應網站上[upload.php中]處理文件的[字段"file"]
3. 要保存在服務器上的[文件名]
4. 上傳文件的[mimeType]
*/
UIImage *image = [UIImage imageNamed:@"頭像1"];
NSData *data = UIImagePNGRepresentation(image);
// 在網絡開發中,上傳文件時,是文件不容許被覆蓋,文件重名
// 要解決此問題,
// 能夠在上傳時使用當前的系統事件做爲文件名
NSDateFormatter *formatter = [[NSDateFormatteralloc] init];
// 設置時間格式
formatter.dateFormat = @"yyyyMMddHHmmss";
NSString *str = [formatter stringFromDate:[NSDate date]];
NSString *fileName = [NSString stringWithFormat:@"%@.png", str];
[formData appendPartWithFileData:data name:@"file"fileName:fileName mimeType:@"image/png"];
}];
// 3. operation包裝的urlconnetion
AFHTTPRequestOperation *op = [[AFHTTPRequestOperationalloc] initWithRequest:request];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"上傳完成");
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"上傳失敗->%@", error);
}];
[_httpClient.operationQueueaddOperation:op];
——斷點續傳
下載
// 1. 創建請求
NSURLRequest *request = [_httpClientrequestWithMethod:@"GET"path:@"download/Objective-C2.0.zip"parameters:nil];
// 2. 操做
AFHTTPRequestOperation *op = [[AFHTTPRequestOperationalloc] initWithRequest:request];
_downloadOperation = op;
// 下載
// 指定文件保存路徑,將文件保存在沙盒中
NSArray *docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [docs[0] stringByAppendingPathComponent:@"download.zip"];
op.outputStream = [NSOutputStreamoutputStreamToFileAtPath:path append:NO];
// 設置下載進程塊代碼
/*
bytesRead 當前一次讀取的字節數(100k)
totalBytesRead 已經下載的字節數(4.9M)
totalBytesExpectedToRead 文件總大小(5M)
*/
[op setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
// 設置進度條的百分比
CGFloat precent = (CGFloat)totalBytesRead / totalBytesExpectedToRead;
NSLog(@"%f", precent);
_progressView.progress = precent;
}];
// 設置下載完成操做
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
// 下載完成以後,解壓縮文件
/*
參數1:要解結壓縮的文件名及路徑 path - > download.zip
參數2:要解壓縮到的位置,目錄 - > document目錄
*/
[SSZipArchiveunzipFileAtPath:path toDestination:docs[0]];
// 解壓縮以後,將原始的壓縮包刪除
// NSFileManager專門用於文件管理操做,能夠刪除,複製,移動文件等操做
// 也能夠檢查文件是否存在
[[NSFileManagerdefaultManager] removeItemAtPath:path error:nil];
// 下一步能夠進行進一步處理,或者發送通知給用戶。
NSLog(@"下載成功");
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"下載失敗");
}];
// 啓動下載
[_httpClient.operationQueueaddOperation:op];