Operation, OperationQueue를 사용하여 리팩토링하기

import Foundation

var cards = [1, 2, 3, 4, 5, 6, 7, 8, 9]

DispatchQueue.global().async {
    for _ in 1...3 {
        let card = cards.removeFirst()
        print("야곰: \\(card) 카드를 뽑았습니다!")
    }
}

DispatchQueue.global().async {
    for _ in 1...3 {
        let card = cards.removeFirst()
        print("노루: \\(card) 카드를 뽑았습니다!")
    }
}

DispatchQueue.global().async {
    for _ in 1...3 {
        let card = cards.removeFirst()
        print("오동나무: \\(card) 카드를 뽑았습니다!")
    }
}
import Foundation

var cards = [1, 2, 3, 4, 5, 6, 7, 8, 9]

class Derrick: Operation {
    override func main() {
        super.main()
        for _ in 1...3 {
            let card = cards.removeFirst()
            print("데릭: \\(card) 카드를 뽑았습니다!")
        }
    }
}

class Bing: Operation {
    override func main() {
        super.main()
        for _ in 1...3 {
            let card = cards.removeFirst()
            print("웡빙: \\(card) 카드를 뽑았습니다!")
        }
    }
}

class Finn: Operation {
    override func main() {
        super.main()
        for _ in 1...3 {
            let card = cards.removeFirst()
            print("핀: \\(card) 카드를 뽑았습니다!")
        }
    }
}

let operation = OperationQueue()
let derrick = Derrick()
let finn = Finn()
let wongbing = Bing()
operation.maxConcurrentOperationCount = 1

operation.addOperations([derrick, finn, wongbing], waitUntilFinished: true)