GCD(Grand Central Dispatch)를 통해 큐의 순서와 속도를 제어하는 방법(2/2)

4337 단어 GCDSwiftqueueasync
->저번의 후속

5. .conceurent 속성 /.initiallynactive 속성


DispatchQue는 label과qos 이외에attributes의 속성을 추가할 수 있습니다.
및 conceurent두 initiallynactive가 있는데 둘 다 큐가 아닌 Work Item을 제어합니다.

A .concurrent


동일한 대기열에서 Work Item의 속성을 동시에 처리합니다.(결과는 아래 A 그림)
    let anotherQueue = DispatchQueue(label: "com.ayakosayama.anotherQueue", qos: .utility, attributes: .concurrent)

     func attribuesTest(){

        anotherQueue.async {
            for i in 0..<10{
                print("🔵",i)
            }
        }

        anotherQueue.async {
            for i in 100..<110{
                print("🔴",i)
            }
        }

        anotherQueue.async {
            for i in 1000..<1010{
                print("⚫️",i)
            }
        }
    }

B .initiallyInactive


직원을 대기열에서 WorkItem을 기다리게 합니다.단독으로 쓰지 않으면 실행 처리를 시작할 수 없습니다.(결과는 다음 그림 B)
    var inactiveQueue: DispatchQueue!
    let anotherQueue = DispatchQueue(label: "com.appcoda.anotherQueue", qos: .utility, attributes: .initiallyInactive)

    func attribuesTest(){

        inactiveQueue = anotherQueue

        anotherQueue.async {
            for i in 0..<10{
                print("🔵",i)
            }
        }

        anotherQueue.async {
            for i in 100..<110{
                print("🔴",i)
            }
        }

        anotherQueue.async {
            for i in 1000..<1010{
                print("⚫️",i)
            }
        }
    }

실행 방법

        attribuesTest()
        if let queue = inactiveQueue{
            queue.activate()
        }

6. 글로벌()로 프리킥 무작위 선택


지금까지 사용자 정의 대기열을 직접 만들었지만, 시스템이 백엔드에서 만든 디스패치 queue의 소장품, 즉 글로벌 대기열을 사용할 수도 있다.
    func globalQueue(){
        let globalQueue = DispatchQueue.global()

        globalQueue.async {
            print(globalQueue.label)  // com.apple.root.default-qos
            for i in 1..<1000{ print("⚫️",i)}
        }
    }
이 경우 처리가 짧고 사용되지 않기 때문에 기본 QOS를 선택했습니다.

7. delayqueue.asyncaAfter()로 대기열 지연 시간 제어하기


아래와 같이 대기열 처리를 2초 늦추는 프로그램을 적어서 실행해 보십시오.
    func queueWithDelay(){
        print(Date())

        let delayqueue = DispatchQueue(label: "com.ayakosayama.delayqueue", qos: .userInteractive)

        let additinalTime:DispatchTimeInterval = .seconds(2)
        delayqueue.asyncAfter(deadline: .now() + additinalTime){
            print(Date())
        }
    }
결과:마침 2초 늦었어요.
2017-07-11 21:14:13 +0000
2017-07-11 21:14:15 +0000

8. 콜백 함수로 다운로드한 UI에 이미지 그리기

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var label: UILabel!

    func fetchImage(){
        label.text = "downloading..."
        let imageURL: URL = URL(string: "https://worldstrides.com/wp-content/uploads/2015/07/12-Chureito-pagoda-and-Mount-Fuji-Japan.jpg")!

        (URLSession(configuration: URLSessionConfiguration.default)).dataTask(with: imageURL, completionHandler: { (imageData, response, error) in

            if let data = imageData {

                DispatchQueue.main.async {
                    self.label.text = "finished downloading!"
                    self.imageView.image = UIImage(data: data)
                }
            }
        }).resume()
    }

이미지 뷰에 이미지를 표시하려면!이런 처리
이미지를 다운로드하기 전에 UI에 표시된 명령을 실행하면 다운로드가 끝나도 표시되지 않습니다.
그러므로 위에서 말한 바와 같다
DispatchQueue.main.async{}로 덮어쓸 수 있습니다.

끝났어!
원자재여기.!
Gihtub 코드는 여기.입니다!

좋은 웹페이지 즐겨찾기