测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可 | MIT |
发布最后发布 | 2015年9月 |
SPM支持 SPM | ✗ |
由 John Hurliman,Sidhant Gandhi 维护。
SYNQueue
是 NSOperationQueue
的子类,因此您将获得
但它超越了 NSOperationQueue
和 NSOperation
,提供
有了好的排队解决方案,您可以在以下方面提供更好的用户体验
当我们开始构建 SYNQueue
时,持久性是我们最注重的功能,因为我们没有在任何地方看到好的通用实现。在这个考虑下,我们为每个 SYNQueueTask
(《:NSOperation》)设计来仅包含关于任务而不是代码本身的相关元数据。
执行任务的实际代码以 taskHandler
闭包的形式传递给队列。每个 SYNQueueTask
必须有一个与之对应的特定 taskHandler
的 taskType
键。
参见仓库顶部示例项目的详细示例。
let queue = SYNQueue(queueName: "myQueue", maxConcurrency: 2, maxRetries: 3,
logProvider: ConsoleLogger(), serializationProvider: NSUserDefaultsSerializer(),
completionBlock: { [weak self] in self?.taskComplete($0, $1) })
logProvider
和serializationProvider
必须分别遵守SYNQueueLogProvider
和SYNQueueSerializationProvider
协议。请参阅 NSUserDefaultsSerializer.swift 和 ConsoleLogger.swift 以获取示例实现。
completionBlock
是当队列中的任务完成时运行(成功或失败)的块。
let t1 = SYNQueueTask(queue: queue, taskID: "1234", taskType: "uploadPhoto", dependencyStrs: [], data: [:])
队列
queue
是你将任务添加到的队列。《code>taskID是任务的唯一标识。taskType
是任务要执行的通用类型。每个taskType
都有自己的taskHandler
。data
是任务执行工作所需的任何元数据。
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++
则不是。
希望这能让你明白,序列化的任务可能在完成前被中断,当我们反序列化这个任务时,会再次运行它。我们只在序列化的任务完成(成功或失败)后才移除该任务。