好东西小知识点

一个结合数据库的任务队列管理方案(iOS实现)

2018-08-24  本文已影响3人  沙琪玛dd

前言

在开发中如果碰到需要执行一些耗时比较长的任务,但是又要保证任务不能丢失,比如执行过程中由于某种原因app发生了crash,需要在下次app启动后的适当时机重新执行任务的情况,该如何解决?

解决方案

类结构说明

taskID为自增Id,当task被添加到队列,写入数据库中时会自动加1。
status表示任务执行的状态,是一个枚举值,枚举类型分为init、running、suspend、finish、fail、remove六种状态,在taskmodel刚被写入数据中时是init的状态,在taskModel执行失败后会将状态置为fail。
priority表示Task的优先级,默认值为low,在taskQueue中可以根据task的优先级对高优先级的任务优先调度执行。
customID用于对task做某种标记,方便从数据库查询。
className存储具体任务的类型如TaskModelA。
data内存储TaskModel归档后的data数据
runCount用于存储task执行的次数,可以用于控制重试次数

run()方法是子类继承TaskModel后必须实现的方法,里面写任务执行的逻辑
prepareForAddToQueue()方法是在run之前会执行的方法,如果重写了该方法,那么在taskQueue执行task之前会先调用prepare方法,返回为yes才会继续执行task的run方法,prepare方法可以用于对task的一些校验。
retryNextTime()方法通过调用taskQueue的retryTask方法将自身的status重置为init状态,那么在taskQueue执行接下来的任务时,就会重新执行到该task。
suspend()方法是将自身的status改为suspend挂起状态,那么taskQueue在执行接下来的task时,由于只会取status为init的task执行,就不会执行到suspend状态的task。当需要重新执行已挂起的task时,调用retry方法就可以重新将该task添加到执行队列中。

taskSignal用于在task执行改变状态时对外发送信号,在对应的controller中可以通过taskSignal传出的task做一些ui或者业务逻辑。
runningTask表示当前队列正在执行的taskModel
suspendTasks保存了所有被挂起的taskModel

架构图

主要架构图.png
上一篇下一篇

猜你喜欢

热点阅读