- afn3.x以后沒(méi)用了NSConnection瓷蛙,全部用NSSession
- 在afn中
AFHTTPSessionManager
就是對(duì)Session的封裝土涝,afn中的序列化和反序列化就不在這說(shuō)碘饼,碰見(jiàn)的問(wèn)題一般都是從服務(wù)器接收值的類型的問(wèn)題和安全性問(wèn)題课蔬,這問(wèn)題網(wǎng)上一搜全都是一樣的答案
.h文件中,在里面需要注意的一個(gè)點(diǎn)是:上傳圖片的時(shí)候烁峭,我們自定義的圖片名中不能出現(xiàn)數(shù)字容客,我的一出現(xiàn)數(shù)字就會(huì)打印上傳失敗,不知大家有沒(méi)有遇到過(guò)
//
// LYNetworking.h
// project2016
//
// Created by liyang on 16/6/14.
// Copyright ? 2016年 liyang. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
typedef void (^ _Nullable Success)(id responseObject); // 成功Block
typedef void (^ _Nullable Failure)(NSError *error); // 失敗Blcok
typedef void (^ _Nullable Progress)(NSProgress * _Nullable progress); // 上傳或者下載進(jìn)度Block
typedef NSURL * _Nullable (^ _Nullable Destination)(NSURL *targetPath, NSURLResponse *response); //返回URL的Block
typedef void (^ _Nullable DownLoadSuccess)(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath); // 下載成功的Blcok
typedef void (^ _Nullable Unknown)(); // 未知網(wǎng)絡(luò)狀態(tài)的Block
typedef void (^ _Nullable Reachable)(); // 無(wú)網(wǎng)絡(luò)的Blcok
typedef void (^ _Nullable ReachableViaWWAN)(); // 蜂窩數(shù)據(jù)網(wǎng)的Block
typedef void (^ _Nullable ReachableViaWiFi)(); // WiFi網(wǎng)絡(luò)的Block
@interface LYNetworking : NSObject
/** 單例聲明 */
+ (instancetype)sharedInstance;
/**
* 網(wǎng)絡(luò)監(jiān)測(cè)(在什么網(wǎng)絡(luò)狀態(tài))
*
* @param unknown 未知網(wǎng)絡(luò)
* @param reachable 無(wú)網(wǎng)絡(luò)
* @param reachableViaWWAN 蜂窩數(shù)據(jù)網(wǎng)
* @param reachableViaWiFi WiFi網(wǎng)絡(luò)
*/
- (void)networkStatusUnknown:(Unknown)unknown reachable:(Reachable)reachable reachableViaWWAN:(ReachableViaWWAN)reachableViaWWAN reachableViaWiFi:(ReachableViaWiFi)reachableViaWiFi;
/**
* 封裝的GET請(qǐng)求
*
* @param URLString 請(qǐng)求的鏈接
* @param parameters 請(qǐng)求的參數(shù)
* @param success 請(qǐng)求成功回調(diào)
* @param failure 請(qǐng)求失敗回調(diào)
*/
- (void)GET:(NSString *)URLString parameters:(NSDictionary *)parameters success:(Success)success failure:(Failure)failure;
/**
* 封裝的POST請(qǐng)求
*
* @param URLString 請(qǐng)求的鏈接
* @param parameters 請(qǐng)求的參數(shù)
* @param success 請(qǐng)求成功回調(diào)
* @param failure 請(qǐng)求失敗回調(diào)
*/
- (void)POST:(NSString *)URLString parameters:(NSDictionary *)parameters success:(Success)success failure:(Failure)failure;
/**
* 下載
*
* @param URLString 請(qǐng)求的鏈接
* @param progress 進(jìn)度的回調(diào)
* @param downLoadPath 下載到的文件路徑(可以為nil约郁,默認(rèn)是caches文件下)
* @param downLoadSuccess 發(fā)送成功的回調(diào)
* @param failure 發(fā)送失敗的回調(diào)
*/
- (void)downLoadWithURL:(NSString *)URLString progress:(Progress)progress destination:(Destination)destination downLoadSuccess:(DownLoadSuccess)downLoadSuccess failure:(Failure)failure;
/**
* 封裝POST圖片上傳(單張圖片)
*
* @param URLString 上傳接口
* @param parameters 上傳參數(shù)
* @param img 上傳圖片
* @param imageName 自定義的圖片名稱(全部用字母寫(xiě)缩挑,不能出現(xiàn)漢字)
* @param fileName 由后臺(tái)指定的圖片名稱
* @param progress 上傳進(jìn)度
* @param success 成功的回調(diào)方法
* @param failure 失敗的回調(diào)方法
*/
- (void)UpLoadWithPOST:(NSString *)URLString parameters:(NSDictionary *)parameters image:(UIImage *)img imageName:(NSString *)imageName fileName:(NSString *)fileName progress:(Progress)progress success:(Success)success failure:(Failure)failure;
/**
* 封裝POST圖片上傳(多張圖片) // 可擴(kuò)展成多個(gè)別的數(shù)據(jù)上傳如:mp3等
*
* @param URLString 請(qǐng)求的鏈接
* @param parameters 請(qǐng)求的參數(shù)
* @param picArray 存放圖片數(shù)組
* @param progress 進(jìn)度的回調(diào)
* @param success 發(fā)送成功的回調(diào)
* @param failure 發(fā)送失敗的回調(diào)
*/
- (void)UpLoadWithPOST:(NSString *)URLString parameters:(NSDictionary *)parameters andPicArray:(NSArray *)picArray progress:(Progress)progress success:(Success)success failure:(Failure)failure;
@end
NS_ASSUME_NONNULL_END
.m文件中的實(shí)現(xiàn)
//
// LYNetworking.m
// project2016
//
// Created by liyang on 16/6/14.
// Copyright ? 2016年 liyang. All rights reserved.
//
#import "LYNetworking.h"
#import <AFNetworking.h>
@implementation LYNetworking
/** 單例聲明 */
+ (instancetype)sharedInstance
{
static LYNetworking *sharedInstance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (sharedInstance == nil) {
sharedInstance = [[self alloc] init];
}
});
return sharedInstance;
}
/**
* 網(wǎng)絡(luò)監(jiān)測(cè)(在什么網(wǎng)絡(luò)狀態(tài))
*
* @param unknown 未知網(wǎng)絡(luò)
* @param reachable 無(wú)網(wǎng)絡(luò)
* @param reachableViaWWAN 蜂窩數(shù)據(jù)網(wǎng)
* @param reachableViaWiFi WiFi網(wǎng)絡(luò)
*/
- (void)networkStatusUnknown:(Unknown)unknown reachable:(Reachable)reachable reachableViaWWAN:(ReachableViaWWAN)reachableViaWWAN reachableViaWiFi:(ReachableViaWiFi)reachableViaWiFi;
{
// 創(chuàng)建網(wǎng)絡(luò)監(jiān)測(cè)者
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
// 監(jiān)測(cè)到不同網(wǎng)絡(luò)的情況
switch (status)
{
case AFNetworkReachabilityStatusUnknown:
unknown();
break;
case AFNetworkReachabilityStatusNotReachable:
reachable();
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
reachableViaWWAN();
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
reachableViaWiFi();
break;
default:
break;
}
}] ;
// 開(kāi)始監(jiān)聽(tīng)網(wǎng)絡(luò)狀況
[manager startMonitoring];
}
/**
* 封裝的get請(qǐng)求
*
* @param URLString 請(qǐng)求的鏈接
* @param parameters 請(qǐng)求的參數(shù)
* @param success 請(qǐng)求成功回調(diào)
* @param failure 請(qǐng)求失敗回調(diào)
*/
- (void)GET:(NSString *)URLString parameters:(NSDictionary *)parameters success:(Success)success failure:(Failure)failure
{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithArray:@[@"application/json",
@"text/html",
@"text/json",
@"text/plain",
@"text/javascript",
@"text/xml",
@"image/*"]];
manager.requestSerializer.timeoutInterval = 20;
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
[manager GET:URLString parameters:parameters progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// 成功的話
if (success){
success(responseObject);
}
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
// 失敗的話
if (failure){
failure(error);
}
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
}];
}
/**
* 封裝的POST請(qǐng)求
*
* @param URLString 請(qǐng)求的鏈接
* @param parameters 請(qǐng)求的參數(shù)
* @param success 請(qǐng)求成功回調(diào)
* @param failure 請(qǐng)求失敗回調(diào)
*/
- (void)POST:(NSString *)URLString parameters:(NSDictionary *)parameters success:(Success)success failure:(Failure)failure
{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithArray:@[@"application/json",
@"text/html",
@"text/json",
@"text/plain",
@"text/javascript",
@"text/xml",
@"image/*"]];
manager.requestSerializer.timeoutInterval = 20;
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; // 開(kāi)啟狀態(tài)欄動(dòng)畫(huà)
[manager POST:URLString parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (success){
success(responseObject);
}
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; // 關(guān)閉狀態(tài)欄動(dòng)畫(huà)
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failure){
failure(error);
}
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; // 關(guān)閉狀態(tài)欄動(dòng)畫(huà)
}];
}
/**
* 封裝POST圖片上傳(單張圖片)
*
* @param URLString 上傳接口
* @param parameters 上傳參數(shù)
* @param img 上傳圖片
* @param imageName 自定義的圖片名稱(全部用字母寫(xiě),不能出現(xiàn)漢字)
* @param fileName 由后臺(tái)指定的圖片名稱
* @param progress 上傳進(jìn)度
* @param success 成功的回調(diào)方法
* @param failure 失敗的回調(diào)方法
*/
- (void)UpLoadWithPOST:(NSString *)URLString parameters:(NSDictionary *)parameters image:(UIImage *)img imageName:(NSString *)imageName fileName:(NSString *)fileName progress:(Progress)progress success:(Success)success failure:(Failure)failure
{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",
@"text/plain",
@"text/javascript",
@"text/json",
@"text/html",
@"image/jpeg", nil];
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; // 開(kāi)啟狀態(tài)欄動(dòng)畫(huà)
NSURLSessionDataTask *uploadTask = [manager POST:URLString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
NSData *imgData = UIImageJPEGRepresentation(img, 1.0);
// 第一個(gè)name是后臺(tái)給圖片在服務(wù)器上起的字段名鬓梅,第二個(gè)fileName是我們自己起的名字
[formData appendPartWithFileData:imgData name:imageName fileName:fileName mimeType:@"image/jpeg"];
} progress:^(NSProgress * _Nonnull uploadProgress) {
if (progress) {
progress(uploadProgress);
}
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (success) {
success(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failure) {
failure(error);
}
}];
[uploadTask resume];
}
/**
* 封裝POST圖片上傳(多張圖片) // 可擴(kuò)展成多個(gè)別的數(shù)據(jù)上傳如:mp3等
*
* @param URLString 請(qǐng)求的鏈接
* @param parameters 請(qǐng)求的參數(shù)
* @param picArray 存放圖片的數(shù)組
* @param progress 進(jìn)度的回調(diào)
* @param success 發(fā)送成功的回調(diào)
* @param failure 發(fā)送失敗的回調(diào)
*/
- (void)UpLoadWithPOST:(NSString *)URLString parameters:(NSDictionary *)parameters andPicArray:(NSArray *)picArray progress:(Progress)progress success:(Success)success failure:(Failure)failure
{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",
@"text/plain",
@"text/javascript",
@"text/json",
@"text/html",
@"image/jpeg", nil];
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; // 開(kāi)啟狀態(tài)欄動(dòng)畫(huà)
NSURLSessionDataTask *uploadTask = [manager POST:URLString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
for (UIImage *img in picArray) {
NSData *imgData = UIImageJPEGRepresentation(img, 1.0);
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd";
NSString *fileName = [NSString stringWithFormat:@"%@-%ld.png",[formatter stringFromDate:[NSDate date]],[picArray indexOfObject:img]];
[formData appendPartWithFileData:imgData name:@"file" fileName:fileName mimeType:@"image/jpeg"];
}
} progress:^(NSProgress * _Nonnull uploadProgress) {
if (progress) {
progress(uploadProgress);
}
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (success) {
success(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failure) {
failure(error);
}
}];
[uploadTask resume];
}
/**
* 下載
*
* @param URLString 請(qǐng)求的鏈接
* @param progress 進(jìn)度的回調(diào)
* @param downLoadPath 下載到的文件路徑(可以為nil供置,默認(rèn)是caches文件下)
* @param downLoadSuccess 發(fā)送成功的回調(diào)
* @param failure 發(fā)送失敗的回調(diào)
*/
- (void)downLoadWithURL:(NSString *)URLString progress:(Progress)progress destination:(Destination)destination downLoadSuccess:(DownLoadSuccess)downLoadSuccess failure:(Failure)failure
{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
NSURL *url = [NSURL URLWithString:URLString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 下載任務(wù)
NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
if (progress) {
progress(downloadProgress);
}
} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
if (destination) {
return destination(targetPath, response);
}else{
return nil;
}
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
if (!error) {
downLoadSuccess(response, filePath);
}else{
failure(error);
}
}];
// 開(kāi)始啟動(dòng)任務(wù)
[task resume];
}
@end
這樣外面調(diào)用的話就很方便了,當(dāng)然只是最簡(jiǎn)單的封裝己肮。緩存等我還不是很明白士袄,等我慢慢摸透了,在來(lái)補(bǔ)充吧