KTBTaskQueue 1.0.1

KTBTaskQueue 1.0.1

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布上次发布2014年12月

Kevin Barrett维护。



KTBTaskQueue 是一个可选持久队列,确保任务完成。它将任务提示给代理或块,直到该任务声明成功或放弃。失败的任务可以立即重试或在未来的某个时间点重试,默认情况下遵循指数退避模式。基本流程如下:

  1. 将任务放入队列。
  2. 队列将任务交给其代理或执行块。无论执行任务的是什么... 执行该任务。您决定执行任务的样子。
  3. 如果任务成功,则从队列中移除。如果不成功,则保留下来,直到它成功或达到 maxRetries 阈值,此时放弃并从队列中移除。

KTBTaskQueue 可以用于跟踪您希望的任务。我发现它对确保在线时网络请求成功以及在离线时保留它们很有用。

使用方法

然后在代码中,假设您使用 AFNetworking 并且希望确保一个特别重要的 POST 请求到达您的服务器。您可以这样做:

// You created this queue in your app delegate or view controller or model.
[self.queue enqueueTaskWithName:@"PostThisVitalThing" userInfo:@{"wow" : "so important"}];

好的,现在队列将一直提示其代理直到 PostThisVitalThing 任务完成。在代理中...

- (void)taskQueue:(KTBTaskQueue *)queue executeTask:(KTBTask *)task completion:(KTBTaskCompletionBlock)completion {
    // The task's userInfo is this request's parameters
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager POST:@"http://example.com/resources.json" parameters:task.userInfo success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
        completion(KTBTaskStatusSuccess);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
        completion(KTBTaskStatusFailure);
    }];
}

默认情况下,PostThisVitalThing 在失败后将重试多达 10 次。该数字可以自定义,以及通过 KTBTask 可用的更长的构造函数中数不尽的其他任务方面。

[self.queue enqueueTask:[KTBTask taskWithName:@"FutureTask"
                                     userInfo:nil
                                availableDate:[NSDate dateWithTimeIntervalSinceNow:60]
                                   maxRetries:3
                                   useBackoff:NO]];

FutureTask 将在现在是下一分钟才尝试,将只能重试 3 次(总共尝试 4 次),并在失败时立即重试——队列不会使用其退避技术延迟重试。

KTBTaskQueueDelegate 提供了更多的灵活性。它包括可选方法来报告任务何时被放弃,并允许应用自定义延迟代替内置的退避延迟。查看 KTBTaskQueue.hKTBTaskQueueDelegate.h 以获取更多详细信息以及可以探索的事情。

KTBTaskQueue 上还有一个 executionBlock 属性,如果您不喜欢代理模式

// Set the block that does the task
queue.executionBlock = ^(KTBTask *task, KTBTaskCompletionBlock completion) {
    // The task's userInfo is this request's parameters
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager POST:@"http://example.com/resources.json" parameters:task.userInfo success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
        completion(KTBTaskStatusSuccess);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
        completion(KTBTaskStatusFailure);
    }];
};
// Enqueue the task
[self.queue enqueueTaskWithName:@"PostThisVitalThing" userInfo:@{"wow" : "so important"}];

还值得一提的是 KTBTaskAlwaysRetry 值,它将防止队列因为太多重试而放弃任务

[self.queue enqueueTask:[KTBTask taskWithName:@"IReallyWantThisDone"
                                     userInfo:nil
                                availableDate:nil
                                   maxRetries:KTBTaskAlwaysRetry
                                   useBackoff:YES]];

此任务立即可用(availableDate 默认为现在)并将重试,直到成功或地球变成尘埃(或者你把手机掉进马桶)。哪个先来。

要求

ARC、iOS 6+ 及由 Gus Mueller 开发的 FMDB。FMDB 将由 Cocoapods 自动导入。请放心,它体积很小。

反馈

请在这里随意打开问题并提交拉取请求。谢谢!

作者

Kevin Barrett,[email protected]

如果这对你有帮助或你认为它很酷,请查看激发这个想法的应用: http://airendipity.com

许可证

KTBTaskQueue 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。