DFINetworkManager 是一个基于 AFNetworking 的网络库。设计此库的初衷是每个网络请求单独放在一个文件中,将网络请求与数据转换从业务逻辑中分离出来。此库旨在为您提供一个良好的网络层架构。
要将 DFINetworkManager 集成到您的 Xcode 项目中,您需要在 Podfile 中添加以下代码。
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
target 'TargetName' do
pod 'DFINetworkManager', '~> 0.02'
end
然后运行以下命令。
$ pod install
iOS 8.0+
DFINetworkHTTPRequestService
DFINetworkService
<DFINetworkServiceProtocol>
DFINetworkAPIRequest
DFINetworkHTTPConfiguration
DFINetworkHTTPSecurityConfiguration
<DFINetworkServiceRACSupportProtocol>
DFINetworkService+RACSupport
DFINetworkReachabilityManager
首先,您需要新建一个文件,名称自定。
DFINetworkServiceProtocol
提供了 Block、Delegation、Notification、RACSignal 来获取返回值。
您可以选择您喜欢的任何一种方式来获取返回值。
@interface NAFetchData () <DFINetworkServiceProtocol>
@end
@implementation NAFetchData
// No need to implement all of methods in DFINetworkServiceProtocol.
- (void)fetchDataWithURLParamaters:(NSDictionary *)paramaters
resultBlock:(DFIAPIRequestResultBlock)resultBlock {
NSString *URLString = @"https://api.github.com/users/facebook";
[DFINetworkAPIRequest requestWithURL:URLString
paramaters:paramaters
requestType:DFINetworkManagerHTTPGETRequest
resultBlock:resultBlock];
}
- (void)fetchDataWithURLParamaters:(NSDictionary *)paramaters {
NSString *URLString = @"https://api.github.com/users/facebook";
[DFINetworkAPIRequest requestWithURL:URLString
paramaters:paramaters
requestType:DFINetworkManagerHTTPGETRequest
notificationName:kNAFetchDataResultNotification];
}
- (void)fetchDataWithURLParamaters:(NSDictionary *)paramaters
delegate:(id<DFINetworkServiceAPIRequestDelegate>)delegate {
NSString *URLString = @"https://api.github.com/users/facebook";
[DFINetworkAPIRequest requestWithURL:URLString
paramaters:paramaters
requestType:DFINetworkManagerHTTPGETRequest
delegate:delegate];
}
@end
如果您在项目中使用了 ReactiveCocoa
,您需要实现 DFINetworkServiceRACSupportProtocol
中的 - (RACSignal *)signalFetchDataWithURLParamaters:
。
- (RACSignal *)signalFetchDataWithURLParamaters:(NSDictionary *)paramaters {
NSString *URLString = @"https://api.github.com/users/facebook";
return [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[DFINetworkAPIRequest requestWithURL:URLString
paramaters:paramaters
requestType:DFINetworkManagerHTTPGETRequest
resultBlock:^(id ret) {
SUBSCRIBER_DATA_HANDLER(subscriber, YES, ret);
}];
return nil;
}] replay];
}
使用 ReactiveCocoa 可以方便地进行数据转换。
- (RACSignal *)signalFetchDataWithURLParamaters:(NSDictionary *)paramaters {
NSString *URLString = @"https://api.github.com/users/facebook";
return [[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[DFINetworkAPIRequest requestWithURL:URLString
paramaters:paramaters
requestType:DFINetworkManagerHTTPGETRequest
resultBlock:^(id ret) {
SUBSCRIBER_DATA_HANDLER(subscriber, YES, ret);
}];
return nil;
}] replay] map:^id(id value) {
return transformData(value); // Such as dictionary to model object.
}];
}
实现这些方法后,您就可以调用它了,无论在 viewController
还是其他地方。您只需传递一个新创建的文件名称和一个包含请求参数的 NSDictionary
类型的对象,就像 @{@"HTTPRequestParamater" : @"value"}
这样。
使用 block 方式获取结果
- (void)fetchDataReturnByBlock {
[DFINetworkService fetchDataByName:@"NAFetchData"
Paramaters:nil
resultBlock:^(id ret) {
}];
}
使用 RACSignal 方式获取结果
- (void)fetchDataReturnBySignal {
[[DFINetworkService signalFetchDataByName:@"NAFetchData"
Paramaters:nil]
subscribeNext:^(id x) {
}];
}
使用通知方式获取结果,您需要注册一个通知中心的观察者
结果包含在 userInfo[kDFINetworkRequestResultKey]
中。
- (void)fetchDataReturnByNotification {
[DFINetworkService fetchDataByName:@"NAFetchData"
Paramaters:nil];
}
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleNotification:)
name:kNAFetchDataResultNotification
object:nil];
- (void)handleNotification:(NSNotification *)notification {
if ([notification.name isEqualToString:kNAFetchDataResultNotification]) {
id result = notification.userInfo[kDFINetworkRequestResultKey];
}
}
使用代理方式获取结果
您需要实现 <DFINetworkServiceAPIRequestDelegate>
中的 - (void)networkAPIRequestTask:result:
。
- (void)fetchDataReturnByDelegte {
[DFINetworkService fetchDataByName:@"NAFetchData"
Paramaters:nil
delegate:self];
}
- (void)networkAPIRequestTask:(NSURLSessionDataTask *)task result:(NSDictionary *)result {
}
POST 的使用方法和 GET 一样,只需将 fetch
替换为 send
。
@interface NASendData () <DFINetworkServiceProtocol>
@end
@implementation NASendData
- (void)sendDataWithURLParamaters:(NSDictionary *)paramaters
resultBlock:(DFIAPIRequestResultBlock)resultBlock {
[DFINetworkAPIRequest requestWithURL:nil
paramaters:paramaters
requestType:DFINetworkManagerHTTPPOSTRequest
resultBlock:resultBlock];
}
@end
使用 block 方式获取结果。
- (void)sendDataByBlock {
[DFINetworkService sendDataByName:@"NASendData"
Paramaters:nil
resultBlock:^(id ret) {
}];
}
[DFINetworkService downloadDataWithURL:(NSString *)URLString
destination:(NSString *)filePath
progressBlock:^(double progress, int64_t totalCountUnit)){}
successBlock:^(NSURLSessionDataTask *sessionDataTask, id ret){}
failBlock:^(NSError *error){}];
[DFINetworkService uploadDataToURL:(NSString *)URLString
withData:(NSData *)data
progressBlock:^(double progress, int64_t totalCountUnit)){}
successBlock:^(NSURLSessionDataTask *sessionDataTask, id ret){}
failBlock:^(NSError *error){}
设置HTTP头
[[DFINetworkHTTPConfiguration defaultConfiguration] setValue:forHTTPHeaderField:];
为了安全起见,创建一个DFINetworkHTTPSecurityConfiguration
实例。
缓存的底层是NSURLCache
,缓存默认是开启状态。
关闭缓存 [DFINetworkService enableURLCache:NO]
清除缓存 [DFINetworkService clearCache]
日志默认是关闭状态。
打开请求日志 [DFINetworkService setEnableLogRequest:YES]
。
打开结果日志 [DFINetworkService setEnableLogResult:YES]
。
DFINetworkManager发布在MIT许可证下。详见LICENSE。