Skip to content

paco-ambilab/JobQueue

Repository files navigation

Job

Version License Platform Build

Description

JobQueue is the way to avoid nested callbacks(Callback Hell). It is similar to PromiseKit. The main difference is this framework prefers not to pass or return a value between jobs/tasks. Those values cause complexity of maintaining due to one job/task change causing the change of the other job/tasks. To simplify it, we prefer to have a data dependency(Environment variable) in JobQueue, and jobs who are in the same JobQueue will share that environment variable.

JobQueue contains a list of Jobs and run them with sequence. It also provides features including:

  • timeout
  • time measurement
  • log delegate
  • retain self for extending the JobQueue lifecycle

Job contains a callback to execute the instruction. It also provides features including:

  • timeout
  • time measurement
  • retry

you can treat Job is a data class to storing the detail of job and allow JobQueue to make it runnable.

WorkFlow

image

Example

class MyDependency: JobQueueDependency {
    var jobName: String = ""
}
JobQueue(label: "TestMeasurement", dependency: MyDependency())
    .addJob(Job<MyDependency>(label: "Job 1", block: { (dependency, result) in
        dependency?.jobName = "Job 1"
        print("run Job 1")
        result.onSuccess()
})).addJob(Job<MyDependency>(label: "Job 2", block: { (dependency, result) in
    dependency?.jobName = "Job 2"
    print("run Job 2")
    result.onSuccess()
})).addJob(Job<MyDependency>(label: "Job 3", block: { (dependency, result) in
    dependency?.jobName = "Job 3"
    print("run Job 3")
    result.onSuccess()
})).run { (queue, error) in
    let dependency = queue.dependency as! MyDependency
    print("Last job name:\(dependency.jobName)")
}

Create JobQueue

let timeout = 30
let jobQueue = JobQueue(label: "TestMeasurement", dependency: NoDependency(), isGuaranteedComplete: true, timeout: TimeInterval(timeout))

Create Job

let timeout = 5
let retryTime = 3
let job = Job<NoDependency>(label: "A Normal Job", timeout: TimeInterval(timeout), retryLimit: retryTime, block: { (dependency, result) in
    // mark as complete
    result.onSuccess()
})

Log Record

image

Customizable Log and Redirect Log to Log server

class YourLogService: JobQueueLoggerDelegate {

    init() {
        JobQueueLogger.shared.delegate = self
    }
    
    // JobQueueLoggerDelegate
    
    func jobQueueLogger(_ logger: JobQueueLogger, logForJobQueue: String) {
        let message = logForJobQueue
        // here to upload message to server 
    }
    
    //Optional 
    //func jobQueueLogger(_ logger: JobQueueLogger, onStart jobQueue: JobQueuePresentable) -> String {}
    
    //func jobQueueLogger(_ logger: JobQueueLogger, onComplete jobQueue: JobQueuePresentable, error: Error?) -> String {}
    
    //func jobQueueLogger(_ logger: JobQueueLogger, onStart job: JobPresentable, jobQueue: JobQueuePresentable) -> String {}
    
    //func jobQueueLogger(_ logger: JobQueueLogger, onRetry job: JobPresentable, jobQueue: JobQueuePresentable) -> String {}
    
    //func jobQueueLogger(_ logger: JobQueueLogger, onComplete job: JobPresentable, jobQueue: JobQueuePresentable,  error: Error?) -> String {}
    
}

To run the example project, clone the repo, and run pod install from the Example directory first.

Requirements

Installation

Job is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod 'Job', :git => 'https://github.com/paco-ambilab/JobQueue.git'

Author

paco89lol@gmail.com, paco89lol@gmail.com

License

Job is available under the MIT license. See the LICENSE file for more info.