SYNQueue 0.2.2

SYNQueue 0.2.2

测试已测试
语言语言 SwiftSwift
许可 MIT
发布最后发布2015年9月
SPM支持 SPM

John HurlimanSidhant Gandhi 维护。



SYNQueue 0.2.2

  • John Hurliman 和 Sidhant Gandhi


适用于 iOS 的简单而强大的排队系统(具有持久性)。

概览

SYNQueueNSOperationQueue 的子类,因此您将获得

  • 顺序或并发队列
  • 任务优先级
  • 多个队列
  • 依赖关系
  • KVC/KVO
  • 线程安全

但它超越了 NSOperationQueueNSOperation,提供

  • 任务持久性(通过协议)
  • 针对队列的特定日志(通过协议)
  • 重试(指数退避)

动机

有了好的排队解决方案,您可以在以下方面提供更好的用户体验

  • 网络请求
  • 保存/创建内容(图像、视频、音频)
  • 上传数据

体系结构

当我们开始构建 SYNQueue 时,持久性是我们最注重的功能,因为我们没有在任何地方看到好的通用实现。在这个考虑下,我们为每个 SYNQueueTask(《:NSOperation》)设计来仅包含关于任务而不是代码本身的相关元数据。

执行任务的实际代码以 taskHandler 闭包的形式传递给队列。每个 SYNQueueTask 必须有一个与之对应的特定 taskHandlertaskType 键。

示例代码

参见仓库顶部示例项目的详细示例。

创建队列

let queue = SYNQueue(queueName: "myQueue", maxConcurrency: 2, maxRetries: 3,
            logProvider: ConsoleLogger(), serializationProvider: NSUserDefaultsSerializer(),
            completionBlock: { [weak self] in self?.taskComplete($0, $1) })

logProviderserializationProvider 必须分别遵守 SYNQueueLogProviderSYNQueueSerializationProvider 协议。

请参阅 NSUserDefaultsSerializer.swiftConsoleLogger.swift 以获取示例实现。

completionBlock 是当队列中的任务完成时运行(成功或失败)的块。

创建任务

let t1 = SYNQueueTask(queue: queue, taskID: "1234", taskType: "uploadPhoto", dependencyStrs: [], data: [:])

队列queue是你将任务添加到的队列。《code>taskID是任务的唯一标识。 taskType是任务要执行的通用类型。每个 taskType 都有自己的 taskHandlerdata 是任务执行工作所需的任何元数据。

添加依赖关系

let t2 = SYNQueueTask(queue: queue, taskID: "5678", taskType: "submitForm", dependencyStrs: [], data: [:])
t2.addDependency(t1)

将其添加到队列

queue.addOperation(t2)
queue.addOperation(t1)

请注意,尽管我们首先将任务t2添加到队列,但它将在其依赖关系 t1 完成执行之前不会执行。

关于持久化的一个重要注意事项

你可能已经注意到了,你可以通过SYNQueueSerializationProvider协议随意序列化任务。 唯一的限制是所有任务必须是幂等的。 即,即使多次调用,任务的结果也应该相同。例如:x = 1是幂等的,x++则不是。

希望这能让你明白,序列化的任务可能在完成前被中断,当我们反序列化这个任务时,会再次运行它。我们只在序列化的任务完成(成功或失败)后才移除该任务。