要运行示例项目;克隆存储库,然后从 Example 目录首先运行 pod install
DHJobController 帮助管理 NSOperations(任务)的工作。与事先创建依赖不同,作业控制器在任务完成时提供回调方法,让作业有地方决定下一步。作业(也是一个 NSOperation)只有在它管理的所有任务都完成后才被认为已完成。结果是用于管理一系列同步或异步步骤的非常简洁的代码。
要创建一个作业,从 DHJobController 继承并像在正常的 NSOperation 中的 start 方法一样实现作业。
- (void)main
{
// start the initial task(s) that run in the job
}
DHJobControllers 只是 NSOperations,所以可以使用正常的 NSOperation API,但可以使用两个辅助方法来启动作业。
MyJob *job = [MyJob alloc] init];
[job startJob];
MyJob *secondJob = [MyJob alloc] init];
[job startJobOnQueue:opQueue];
作业管理任务,这些任务只是 NSOperations。作业控制器可以在它管理的队列上启动任务,也可以提供其中一个。为了跟踪任务,创建其类的实例,然后使用跟踪...方法之一。
- (void)main
{
MyTask *task = [MyTask alloc] init];
// use trackTask to simply add the task to the list to be monitored. You have to add it to a queue
// yourself.
[self trackTask:task];
[someQueue addOperation:task];
// use trackAndQueueTask to add the task to a queue and monitor it's progress
[self trackAndQueueTask:task];
}
任务完成时,作业控制器有两种方式响应并决定作业的下一步行动。响应任务完成的第一种机制是实现在你的作业控制器子类中的方法 taskFinished:
- (void)taskFinished:(id)task
{
if ( [task isKindOfClass:[MyTask class]] ) {
MyTask *finishedTask = (MyTask *)task;
// decide what to do next in the job (start more tasks, for example)
}
}
另一种响应任务完成的方式是为你的作业控制器设置单个任务的完成选择器。您可以为作业中的每个单个任务设置完成选择器,或者将通用方法 taskFinished 和特定完成选择器混合匹配。
- (void)main
{
MyTask *task = [MyTask alloc] init];
[self trackAndQueueTask:task withCompletion:@selector(myTaskFinished:)];
}
- (void)myTaskFinished:(id)myTask
{
MyTask *task = (MyTask *)myTask;
}
提供额外的完成方法来跟踪基于任务类的任务组的完成。首先是任务组完成时的回调。
- (void)taskGroupFinished:(NSString *)groupName
{
if ( [groupName isEqualToString:NSStringFromClass([MyTask class]))] ) {
// all the MyTask tasks are completed
}
}
并且可以为组设置特定的选择器。
- (void)main
{
[self setCompletion:@selector(myTasksFinished) group:[MyTask class]];
}
- (void)myTasksFinished
{
// all the MyTask tasks are done
}
最后,可以在作业子类中重写的方法,当所有任务完成时将被调用。
- (void)allTasksFinished
{
// all tasks finished and the job is basically done
}
使用NSOperations时,一个常见的需求是处理当NSOperation主方法完成时仍未完成异步操作。为了处理这种情况,您必须手动管理NSOperation的isFinished和isExecuting属性。DHConcurrentOperation类提供了一个创建并发操作更简单的方法。要使用此类,您应该继承DHConcurrentOperation而不是NSOperation,然后实现operationStart方法,当异步操作完成时最终调用operationDone方法。
大卫·豪斯(David House),[email protected]
DHJobController可以在MIT许可协议下使用。更多信息请参阅LICENSE文件。