Docker 1.3.11

Docker 1.3.11

测试已测试
语言语言 Obj-CObjective C
许可 Apache-2.0
发布最新版本2021年7月

Francesco CeravoloGuido SabatiniPaolo ArdiaNicola SacchettiLorenzo Rossi维护。



Docker 1.3.11

  • Sysdata S.p.A.

Docker

Version License Platform

示例

要运行示例项目,请克隆仓库,并首先从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服务调用的基础类。有一个作为单例的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文件中的文档。