延迟任务工具包 (DefferedTaskKit)

延迟任务工具包是一个简单的库,用于包装可以稍后执行的闭包。

延迟任务 (DefferedTask)

DefferedTask 处理 Value 类型,而 DefferedResult 处理 Result 类型。

重要提示

  1. 任务只有在通过 'onComplete' 方法订阅后才会被执行。 如果你不订阅任务,它将永远不会被执行。
  2. 默认情况下,任务是“自保留”的,你不需要在变量中保存任务的引用。 使用 'weakify()' 方法来防止循环引用。
  3. 如果需要,你可以处理任务的 'deinit' (析构) 方法。

延迟任务 (DefferedTask)

DefferedTask<Int> { completion in
    print("start task")
    DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
        completion(10)
        print("end task")
    }
} onDeinit: {
    print("onDeinit")
}
.beforeComplete { result in
    print("beforeComplete: \(result)") // print 10
}
.afterComplete { result in
    print("afterComplete: \(result)") // print 10
}
.set(userInfo: "subject")
.strongify()
.map { value in
    return value * 2
}
.beforeComplete { result in
    print("beforeComplete: \(result)") // print 20
}
.afterComplete { result in
    print("afterComplete: \(result)") // print 20
}
.onComplete { result in
    print("onComplete: \(result)") // print 20
}

控制台输出

start task
beforeComplete: 10
beforeComplete: 20
onComplete: 20
afterComplete: 20
afterComplete: 10
onDeinit
end task

待处理任务 (PendingTask)

特殊的任务,在执行单个主要任务时缓存其他任务。

let pending: PendingTask<Int> = .init()

for i in 0..<10 {
    pending.current { completion in
        print("start main task")
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            completion(10)
            print("end main task")
        }
    }.onComplete { _ in
        print("onComplete: \(i)")
    }
}

控制台输出

start main task
onComplete: 0
onComplete: 1
onComplete: 2
onComplete: 3
onComplete: 4
onComplete: 5
onComplete: 6
onComplete: 7
onComplete: 8
onComplete: 9
end main task

轮询任务 (PollingTask)

特殊的任务,以 idleTimeInterval (空闲时间间隔) 和 retryCount (重试次数) 轮询主要任务。

var idx = 0
PollingTask<Int>(idleTimeInterval: 1,
                 retryCount: 5,
                 generator: {
    return .init { completion in
        print("start main task")
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            completion(idx)
            idx += 1
            print("end main task")
        }
    }
},
                 shouldRepeat: { idx in
    print("shouldRepeat \(idx)")
    return idx < 4
},
                 response: { idx in
    print("response: \(idx)")
})
.start()
.onComplete { result in
    print("completed \(result)")
} 

控制台输出

start main task
response: 0
shouldRepeat 0
end main task
start main task
response: 1
shouldRepeat 1
end main task
start main task
response: 2
shouldRepeat 2
end main task
start main task
response: 3
shouldRepeat 3
end main task
start main task
response: 4
shouldRepeat 4
completed 4
end main task