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