I have several Dispatch work items to execute on a queue i don't want to redeclare the codes, i want to pass them to an array or list of DispatchWorkItems
and then inject it to a dispatch queue is there any way to achieve this ?
func executeDispatchWorkItem(url: String, completion : @escaping (Result<String,Error>)-> Void,beganHandler : @escaping (String)-> Void){
do {
beganHandler("\(url) Began to execute ")
let content = try String(contentsOf:URL(string: url)!)
completion(.success(content))
}
catch let error {
completion(.failure(error))
}
sleep(1)
}
var serialQueue = DispatchQueue(label: "A queue")
serialQueue.async {
executeDispatchWorkItem(url: "https://www.google.com/",completion:
{data in
switch data {
case .success(let data):
print("URL : \(data) completed with \(String(describing: data))")
case .failure(let error ):
print("URL : \(error.localizedDescription) failed with \(error.localizedDescription)")
}
}, beganHandler: { me in
print("\(me) began to execute ")
})
executeDispatchWorkItem(url: "www.facebook.com",completion: {data in
switch data {
case .success(let data):
print("URL : \(data) completed with \(String(describing:
data))")
case .failure(let error ):
print("URL : \(error.localizedDescription) failed with \(error.localizedDescription)")
}
}, beganHandler: { me in
print("\(me) began to execute ")
})
executeDispatchWorkItem(url: "www.youtube.com",completion: {data in
switch data {
case .success(let data):
print("URL : \(data) completed with \(String(describing: data))")
case .failure(let error ):
print("URL : \(error.localizedDescription) failed with \(error.localizedDescription)")
}
}, beganHandler: { me in
print("\(me) began to execute ")
})
/// HOW EVER I WANT TO ACHIEVE SOMETHING LIKE THIS
let itemsToExecute : [DispatchWorkItem] = [dispatch1.dispatch2]
// IS THIS POSSIBLE ?
serialQueue.sync(execute: itemsToExecute) ?
Yes, you can have an array of
DispatchWorkItem
objects, but to dispatch them all, you’d just have to iterate through them, e.g., with eitherfor
-in
orforEach
:Note, I used
async
vssync
, because the whole point of using GCD is to avoid blocking the main queue, and whilesync
blocks,async
doesn’t.This begs the question of why you’d bother using an array of
DispatchWorkItem
at all, though. Just add the tasks to the queue directly, and the queue takes care of keeping track of all of them for you.Frankly, we’d probably just want to use
URLSession
. For example:Where perhaps:
Then, you can do something like: