MBTaskContainer
是一个简单的类,允许您将您的 NSURLSessionTask
添加到其中,并安全地从其中读取活动任务。
假设您的服务器使用 OAuth2
认证标准,在建立连接以访问您的 API
之前,您需要获取一个令牌。再次假设您的应用程序具有以下类似的架构
ViewController
-> DataController
其中 1. ViewController
UIViewController
子类UIButton
来取消正在进行的网络操作DataController
NSObject
子类在这种情况下,我们不能立即从 DataController
将实际进行中的网络任务返回到 ViewController
,即使一个简单的网络请求也可能像以下这样
ViewController
调用 DataController
的 getItems
方法DataController
提出请求401 Unauthorized
DataController
提出另一个请求以获取新的令牌DataController
重新尝试 getItems
请求简而言之,将有多个异步执行的任务,一些跟随另一些。为了解决这个问题,您可以使用 MBTaskContainer
!
DataController:getItems
返回一个 MBTaskContainer
实例。ViewController
可以在任何时候访问活跃的网络任务。MBTaskContainer
允许您以安全的方式从多个线程添加/读取任务。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 文件。