寫在前面
分享此實(shí)例,希望能幫到一些像我一樣的初學(xué)者。
代碼有哪些不好的地方,還望各位讀者多多指教。
源碼請(qǐng)戳這
頭文件 JDNetworkRequest.h
#import <Foundation/Foundation.h>
@protocol JDNetworkRequestDatasource <NSObject>
- (NSString *)jdNetworkRequestBaseURLString; //用于初始化的網(wǎng)址
@end
//網(wǎng)絡(luò)請(qǐng)求類型
typedef NS_ENUM(NSUInteger,JDNetworkRequestType) {
JDNetworkRequestTypePost,
JDNetworkRequestTypeGet,
JDNetworkRequestTypeHead,
JDNetworkRequestTypePut,
JDNetworkRequestTypeDelete
};
typedef void(^JDNetworkRequestResultBlock)(id responseObject,NSError *error);
@interface JDNetworkRequest : NSObject
@property (nonatomic, weak) id<JDNetworkRequestDatasource> datasource;
/**
* 發(fā)送網(wǎng)絡(luò)請(qǐng)求
*
* @param urlString 網(wǎng)址字符串
* @param parameters 參數(shù)
* @param type 請(qǐng)求類型
* @param resultBlock 返回結(jié)果:responseObject,error
*/
- (void)jd_requestWithURLString:(NSString *)urlString
parameters:(NSDictionary *)parameters
type:(JDNetworkRequestType)type
resultBlock:(JDNetworkRequestResultBlock)resultBlock;
@end
實(shí)現(xiàn)文件 JDNetworkRequest.m
類擴(kuò)展部分
@interface JDNetworkRequest ()
@property (nonatomic, strong) AFHTTPSessionManager *manager;
@property (nonatomic, assign, getter=isConnected) BOOL connected; /**<網(wǎng)絡(luò)是否連接*/
@end
介紹網(wǎng)絡(luò)請(qǐng)求方法之前,先介紹幾個(gè)會(huì)用到的方法
- 判斷網(wǎng)絡(luò)是否連接的方法
- (BOOL)isConnected {
struct sockaddr zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sa_len = sizeof(zeroAddress);
zeroAddress.sa_family = AF_INET;
SCNetworkReachabilityRef defaultRouteReachability =
SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
SCNetworkReachabilityFlags flags;
BOOL didRetrieveFlags =
SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
CFRelease(defaultRouteReachability);
if (!didRetrieveFlags) {
printf("Error. Count not recover network reachability flags\n");
return NO;
}
BOOL isReachable = flags & kSCNetworkFlagsReachable;
BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
return (isReachable && !needsConnection) ? YES : NO;
}
-
self.manager懶加載
- (AFHTTPSessionManager *)manager { if (!_manager) { NSString *baseUrlString = [self.datasource jdNetworkRequestBaseURLString]; _manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:baseUrlString]]; } return _manager; }
統(tǒng)一處理返回參數(shù)的方法
- (void)handleRequestResultWithDataTask:(NSURLSessionDataTask *)task
responseObject:(id)responseObject
error:(NSError *)error
resultBlock:(JDNetworkRequestResultBlock)resultBlock {
//do something here...
JD_EXECUTE_BLOCK(resultBlock,responseObject,error);
}
網(wǎng)絡(luò)請(qǐng)求方法的具體實(shí)現(xiàn)如下:
@implementation JDNetworkRequest
- (void)jd_requestWithURLString:(NSString *)urlString
parameters:(NSDictionary *)parameters
type:(JDNetworkRequestType)type
resultBlock:(JDNetworkRequestResultBlock)resultBlock {
if (!self.isConnected) {
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"溫馨提示"
message:@"沒有網(wǎng)絡(luò),建議在手機(jī)設(shè)置中打開網(wǎng)絡(luò)"
delegate:self
cancelButtonTitle:nil
otherButtonTitles:@"退出", nil];
[alertView show];
return;
}
if (![self.datasource respondsToSelector:@selector(jdNetworkRequestBaseURLString)]) { //未實(shí)現(xiàn)datasource
JDLog(@"error:未實(shí)現(xiàn)JDNetworkRequestDatasource");
return;
}
NSSet *acceptableContentTypes = [NSSet setWithObjects:@"application/json",
@"text/html",
@"text/json",
@"text/javascript",
@"text/plain", nil];
self.manager.operationQueue.maxConcurrentOperationCount = 5;
self.manager.requestSerializer.timeoutInterval = 3;
self.manager.responseSerializer.acceptableContentTypes = acceptableContentTypes;
switch (type) {
case JDNetworkRequestTypePost: {
[self.manager POST:urlString
parameters:parameters
success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) {
[self handleRequestResultWithDataTask:task
responseObject:responseObject
error:nil
resultBlock:resultBlock];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[self handleRequestResultWithDataTask:task
responseObject:nil
error:error
resultBlock:resultBlock];
}];
break;
}
...
其他JDNetworkRequestType限于篇幅,就不一一列出,
有興趣的可以看源碼
如何使用?
-
實(shí)現(xiàn)JDNetworkRequestDatasource
#pragma mark - JDNetworkRequestDatasource- (NSString *)jdNetworkRequestBaseURLString { //TODO: 網(wǎng)址是無效的,請(qǐng)自行更換 return @"http://www.example.com"; }
調(diào)用網(wǎng)絡(luò)請(qǐng)求方法
JDNetworkRequest *networkRequest = [[JDNetworkRequest alloc]init];
networkRequest.datasource = self;
//TODO: 以下網(wǎng)址及參數(shù)是無效的,請(qǐng)自行更換
NSString *urlString = @"http://www.example.com/?_c=thread&_a=threadInfo";
NSDictionary *parameters = @{ @"msg_id" : @0,
@"sign" : @"149f7fd34ba2a961ab52ac0225da7f6c",
@"time" : @"1447414060",
@"token" : @"FMXa++Q0Lwkue+Mdirr6lw==",
@"thread_id" : @"198"
};
[networkRequest jd_requestWithURLString:urlString
parameters:parameters
type:JDNetworkRequestTypePost
resultBlock:^(id responseObject, NSError *error) {
NSLog(@"%@",responseObject);
}];
寫在最后
歡迎各位讀者指教不足之處。