DFINetworkManager 0.0.3

DFINetworkManager 0.0.3

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布上次发布2016年9月

sdaheng 维护。



  • sdaheng

DFINetworkManager 是一个基于 AFNetworking 的网络库。设计此库的初衷是每个网络请求单独放在一个文件中,将网络请求与数据转换从业务逻辑中分离出来。此库旨在为您提供一个良好的网络层架构。

Podfile

要将 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+

架构

HTTP 请求
  • DFINetworkHTTPRequestService
API 请求
  • DFINetworkService
  • <DFINetworkServiceProtocol>
  • DFINetworkAPIRequest
配置
  • DFINetworkHTTPConfiguration
  • DFINetworkHTTPSecurityConfiguration
ReactiveCocoa 支持
  • <DFINetworkServiceRACSupportProtocol>
  • DFINetworkService+RACSupport
其他功能
  • DFINetworkReachabilityManager

使用方法

GET

首先,您需要新建一个文件,名称自定。

QQ20160906-0@2x

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

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配置

设置HTTP头

[[DFINetworkHTTPConfiguration defaultConfiguration] setValue:forHTTPHeaderField:];
HTTPS配置

为了安全起见,创建一个DFINetworkHTTPSecurityConfiguration实例。

缓存

缓存的底层是NSURLCache,缓存默认是开启状态。

关闭缓存 [DFINetworkService enableURLCache:NO]

清除缓存 [DFINetworkService clearCache]

日志

日志默认是关闭状态。

打开请求日志 [DFINetworkService setEnableLogRequest:YES]

打开结果日志 [DFINetworkService setEnableLogResult:YES]

许可证

DFINetworkManager发布在MIT许可证下。详见LICENSE。