MBTaskContainer 0.1.5

MBTaskContainer 0.1.5

测试已测试
Lang语言 Obj-CObjective C
许可协议 MIT
发布上次发布2016年8月

Mert Buran维护。



什么是 MBTaskContainer?

MBTaskContainer 是一个简单的类,允许您将您的 NSURLSessionTask 添加到其中,并安全地从其中读取活动任务。

示例场景

假设您的服务器使用 OAuth2 认证标准,在建立连接以访问您的 API 之前,您需要获取一个令牌。再次假设您的应用程序具有以下类似的架构

ViewController -> DataController 其中 1. ViewController

  • 典型的 UIViewController 子类
  • 它可能有一个 UIButton 来取消正在进行的网络操作
    1. DataController
  • NSObject 子类
  • 负责执行网络调用

在这种情况下,我们不能立即从 DataController 将实际进行中的网络任务返回到 ViewController,即使一个简单的网络请求也可能像以下这样

  1. ViewController 调用 DataControllergetItems 方法
  2. DataController 提出请求
  3. 请求返回 401 Unauthorized
  4. DataController 提出另一个请求以获取新的令牌
  5. 在收到新令牌后,DataController 重新尝试 getItems 请求

简而言之,将有多个异步执行的任务,一些跟随另一些。为了解决这个问题,您可以使用 MBTaskContainer

示例解决方案

  1. DataController:getItems 返回一个 MBTaskContainer 实例。
  2. 每当创建一个新的网络任务时,将其添加到返回的实例中。
  3. ViewController 可以在任何时候访问活跃的网络任务。

我们为什么不能使用 NSArray 来这样做?

  1. MBTaskContainer 允许您以安全的方式从多个线程添加/读取任务。
    • 同一时间具有多个读者和一个作家/移除器。
  2. MBTaskContainer 负责移除。您不需要移除已完成的任务。

示例用法

// DataController.m
- (MBTaskContainer *)seriallyGetRepositoriesOrganizationsMembers {
    MBTaskContainer *taskContainer = [MBTaskContainer new];

    NSURLSessionTask *repositories = [self fetchDataWithRelativeURL:repositoriesURL completion:^(NSError *error) {
        if (error == nil) {
            NSURLSessionTask *organizations = nil;
            organizations = [self fetchDataWithRelativeURL:organizationsURL completion:^(NSError *error) {
                if (error == nil) {
                    NSURLSessionTask *members = nil;
                    members = [self fetchDataWithRelativeURL:membersURL completion:nil];

                    [taskContainer addTask:members];
                }
            }];

            [taskContainer addTask:organizations];
        }
    }];

    [taskContainer addTask:repositories];

    return taskContainer;
}

// ViewController.m
...
self.serialTaskContainer = [self.dataController seriallyGetRepositoriesOrganizationsMembers];
NSArray *activeTasks = [self.serialTaskContainer getTasks];
...
// To cancel ongoing and potential new tasks
self.serialTaskContainer.state = MBTaskContainerStateCancelling;
...

安装

MBTaskContainer 可以通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile 中

pod "MBTaskContainer"

作者

Mert Buran, [email protected]

许可

MBTaskContainer 提供 MIT 许可。有关更多信息,请参阅 LICENSE 文件。