Docker
示例
要运行示例项目,请克隆仓库,并首先从Example目录运行pod install
命令。
要求
iOS 8及以上,AFNetworking 2.6.3(作为Pod依赖项)
安装
Docker可以通过CocoaPods获取。要安装它,只需将以下行添加到您的Podfile中
pod 'Docker'
如果您想使用我们的日志框架Blabber,请使用subpod
pod 'Docker/Blabber'
使用Blabber,您可以管理所有日志消息或使用CocoaLumberjack。在这种情况下,也需要导入相应的子模块。更多信息...
pod 'Docker/Blabber'
pod 'Blabber/CocoaLumberjack'
许可证
Docker在Apache许可证下可用。有关更多信息,请参阅LICENSE文件。
简介
Docker是一个库,可用于以简单的方式管理所有与远程服务器的通信。Docker由两个模块组成。
-
SDServiceManager:处理Web服务调用
-
SDDownloadManager:处理资源下载和本地缓存
服务管理器
SDServiceManager是处理Web服务调用的基础类。有一个作为单例的sharedServiceManager,它可以用于调用和管理应用程序所需的所有服务。不应该直接使用SDServiceManager,而是建议对它进行子类化。
主要特性
-
轻松定义请求(头信息、参数、HTTP方法、基本URL、相对路径)
-
轻松定义响应和错误类,并进行映射
-
在演示模式下的服务(使用您的bundle中的静态JSON文件测试服务)
-
模拟给定范围内的随机时间间隔
-
模拟成功响应
-
模拟错误响应,带有给定失败概率的HTTP状态码
-
@interface MyServiceManager : SDServiceManager
- (void) callServiceForNumUsers:(NSNumber*)num withCompletion:(ServiceCompletionSuccessHandler)completion failure:(ServiceCompletionFailureHandler)failure;
@end
SDServiceManager使用AFNetworking框架(版本2.0),因此您应该定义AFHTTPRequestOperationManager来调用服务。在初始化时,在defaultRequestOperationManager中定义您的基本服务URL。如果您需要(例如,您的应用程序与不同的Web服务通信),您可以实例化不同的requestOperationManager并将它们分配给每个特定的服务器。
@implementation MyServiceManager
- (instancetype)init
{
self = [super init];
if(self)
{
self.defaultRequestOperationManager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"https://randomuser.me"]];
self.defaultRequestOperationManager.requestSerializer = [AFJSONRequestSerializer serializer];
self.defaultRequestOperationManager.requestSerializer.HTTPMethodsEncodingParametersInURI = [NSSet setWithObjects:@"GET", @"HEAD", nil];
self.defaultRequestOperationManager.responseSerializer = [AFJSONResponseSerializer serializer];
}
return self;
}
- (void) callServiceForNumUsers:(NSNumber*)num withCompletion:(ServiceCompletionSuccessHandler)completion failure:(ServiceCompletionFailureHandler)failure
{
SDServiceExample* service = [SDServiceExample new];
SDServiceExampleRequest* request = [SDServiceExampleRequest new];
request.numUsers = num;
[self callService:service withRequest:request operationType:0 delegate:nil completionSuccess:completion completionFailure:failure];
}
每个Web服务应该是SDServiceGeneric的一个子类,并实现其协议以定义请求、响应和错误行为。如果您的服务具有application/json内容类型,您可以使用使用Mantle框架进行json映射和值转换的SDServiceMantle。
在上面的示例中,您可以看到服务的定义、请求和预期响应。
@interface SDServiceExample : SDServiceMantle
@end
@interface SDServiceExampleRequest : SDServiceMantleRequest
@property (nonatomic, strong) NSNumber* numUsers;
@end
@interface MTLUser : MTLModel <MTLJSONSerializing>
@property (nonatomic, strong) NSString* firstName;
@property (nonatomic, strong) NSString* lastName;
@property (nonatomic, strong) NSString* imageUrl;
@end
@interface SDServiceExampleResponse : SDServiceMantleResponse
@property (nonatomic, strong) NSArray<MTLUser*>* users;
@end
在您的服务实现中,您应该定义
-
要使用的 请求操作管理器
-
资源的 相对路径
-
的 HTTP方法
-
在成功情况下将映射响应的 响应类
-
在失败情况下将映射响应的 错误类
@implementation SDServiceExample
- (AFHTTPRequestOperationManager *)requestOperationManager
{
return [MyServiceManager sharedServiceManager].defaultRequestOperationManager;
}
- (NSString*) pathResource
{
return @"/api";
}
- (SDHTTPMethod) requestMethodType
{
return SDHTTPMethodGET;
}
- (Class) responseClass
{
return [SDServiceExampleResponse class];
}
@end
在您的请求、响应和错误类中,您应该为每个属性定义映射。例如,使用 Mantle
@implementation SDServiceExampleResponse
+ (NSDictionary*) JSONKeyPathsByPropertyKey
{
return @{
@"users":@"results"
};
}
+ (NSValueTransformer*) usersJSONTransformer
{
return [MTLJSONAdapter arrayTransformerWithModelClass:[MTLUser class]];
}
@end
@implementation MTLUser
+ (NSDictionary*) JSONKeyPathsByPropertyKey
{
return @{
@"firstName":@"name.first",
@"lastName":@"name.last",
@"imageUrl":@"picture.medium"
};
}
@end
有关更多详细信息,请访问 - SDServiceGenericProtocol 以定义服务的所有详细信息(例如,还可以定义用于在演示模式下测试的本地json) - SDServiceGenericRequestProtocol 以定义有关请求的详细信息 - SDServiceGenericResponseProtocol 以定义有关响应的详细信息 - SDServiceGenericErrorProtocol 以定义在失败情况下响应的详细信息
下载管理器
SDDownloadManager 是管理所有下载通信的主要类,将下载的资源本地缓存(在 NSCache、文件系统中等,取决于给定的设置)。它使用 AFNetworking 框架的 AFHTTPRequestOperationManager(版本 2.0)。
主要功能
-
在下载之前从 包 中搜索资源(例如,如果您有一个种子包)
-
可以使用 文件系统 来持久化下载的资源
-
可以使用 NSCache 以更快的速度检索它们
-
可以使用 HEAD请求 检查已下载资源的 新更新(比较服务器资源的修改日期与本地的一个,如果揭示更新则将其下载)
-
可以定义用于持久化资源的本地路径
-
检查要批量下载的多个资源的全局大小
-
在批量操作中 下载多个资源
-
SDDownloadImageView 以轻松方式处理图像下载
-
.....
主要方法有
- (void) getResourceAtUrl:(NSString* _Nonnull)urlString type:(DownloadOperationType)type options:(SDDownloadOptions* _Nullable)options completionSuccess:(SDDownloadManagerCompletionSuccessHandler _Nullable)completionSuccess progress:(SDDownloadManagerProgressHandler _Nullable)progress completionFailure:(SDDownloadManagerCompletionFailureHandler _Nullable)completionFailure;
和
- (void) getResourceWithRequest:(NSMutableURLRequest* _Nonnull)request type:(DownloadOperationType)type options:(SDDownloadOptions* _Nullable)options completionSuccess:(SDDownloadManagerCompletionSuccessHandler _Nullable)completionSuccess progress:(SDDownloadManagerProgressHandler _Nullable)progress completionFailure:(SDDownloadManagerCompletionFailureHandler _Nullable)completionFailure;
该操作会在本地查找资源,如果不可用或不仍然有效,则会下载它。在所有操作之前,它会根据您的设置在内存缓存或文件系统中查找资源,使用其URL的MD5作为密钥。如果本地有资源,它会使用 ExpirationDatePlist(根据 useExpirationDatePlist 设置)检查其有效性,并检查其过期日期。如果资源仍然有效,则立即返回,否则它会根据 useHeadRequestToCheckUpdates 设置触发一个 HEAD请求(比较修改日期)。如果修改日期相同,则本地资源有效并返回,否则开始下载更新。资源下载后,它将更新 internalDatePlist(如果使用),在 NSCache 中保存(如果设置),并在文件系统中保存(如果设置)。您可以使用带 NSMutableRequest 的第二个签名,因为Web服务器在提供资源之前需要更具体的参数(例如,自定义头,HTTP POST方法等)。
SDDownloadManager 还可以用于在给定的URL中对资源的总大小进行 批量计数。
- (void) countDownloadSizeForResourceAtUrls:(NSArray<NSString*>* _Nonnull)urlStrings options:(SDDownloadOptions* _Nullable)options progress:(SDDownloadManagerBatchOperationProgressHandler _Nullable)progress completion:(SDDownloadManagerCheckSizeCompletion _Nullable)completion
此方法检查所有缺失的资源,并计算所有Content-Length的数量。之后,如果您想下载所有已检查和缺失的资源,可以使用
- (void) downloadAllElementsCheckedWithProgress:(SDDownloadManagerBatchOperationProgressHandler _Nullable)progress completion:(SDDownloadManagerBatchOperationCompletion _Nullable)completion;
下载图片视图
如果您不需要太多的控制,但只想处理远程服务器上的图像,可以使用SDDownloadImageView。它是UIImageView的一个子类,用于处理下载、持久化、动画以及许多关于在远程服务器上存储图像的选项。内部此类使用SDDownloadManager的功能,透明地为您提供。
NSString* urlString = @"http://images.freeimages.com/images/previews/aaa/spanish-village-street-1445758.jpg";
SDDownloadImageView* downloadImageView = [SDDownloadImageView new];
downloadImageView.showActivityIndicatorWhileLoading = YES;
downloadImageView.showLocalImageBeforeCheckingValidity = YES;
downloadImageView.placeHolderImage = nil;
[downloadImageView setImageWithURLString:urlString completion:^(NSString* urlString, UIImage* image, DownloadOperationResultType resultType) {
}];
有关更多详细信息和使用方法,请查看附带的示例和.h文件中的文档。