강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của xpflxhfl948142
xpflxhfl948142

câu hỏi đã được viết

Alan iOS Concurrency - Tìm hiểu hàng đợi công văn và hàng đợi hoạt động

1) Các tác vụ phải được xử lý trong hàng đợi chính 2) Các biện pháp phòng ngừa về phương thức đồng bộ hóa 3) Cẩn thận với việc thu thập yếu và mạnh 4) Lý do tồn tại của trình xử lý hoàn thành 5) Cách tạo một hàm đồng bộ như hàm không đồng bộ

동기적 함수를 비동기적 함수로 바꾸는 부분에서 질문 있습니다

Đã giải quyết

Viết

·

271

1

func asyncTiltShift(_ inputImage: UIImage?, runQueue: DispatchQueue, completionQueue: DispatchQueue, completion: @escaping (UIImage?, Error?) -> ()) {
    
    runQueue.async {
        var error: Error?
        error = .none
        
        let outputImage = tiltShift(image: inputImage)
        
        completionQueue.async {
            completion(outputImage, error)
        }
    }
}

runQueue는 이미 비동기로 돌아가고 있는데 굳이 completionQueue에서 다시 한번 더 비동기로 돌아가게 만드는 이유가 무엇인가요?

 

강의 너무 잘 듣고 있습니다 :)

iosswift

Câu trả lời 2

2

xpflxhfl948142님의 프로필 이미지
xpflxhfl948142
Người đặt câu hỏi

빠른 답변 감사합니다!

2

allen님의 프로필 이미지
allen
Người chia sẻ kiến thức

안녕하세요 본성 님!

원하시면 굳이 comletionQueue를 만드실 필요가 없습니다. 다만, 일반적으로 콜백함수가 main큐에서 일해야하는 경우가 많기 때문에 함수를 그런식으로 설계했을 뿐입니다.

func asyncTiltShift(_ inputImage: UIImage?, runQueue: DispatchQueue, completionQueue: DispatchQueue, completion: @escaping (UIImage?, Error?) -> ()) {
    
    runQueue.async {
        var error: Error?
        error = .none
        
        let outputImage = tiltShift(image: inputImage)
        
        completionQueue.async {
            completion(outputImage, error)
        }
    }
}

위처럼 하셔도 되고,

아래처럼 completionQueue없이 설계하신 다음

func asyncTiltShift(_ inputImage: UIImage?, runQueue: DispatchQueue, completion: @escaping (UIImage?, Error?) -> ()) {
    
    runQueue.async {
        var error: Error?
        error = .none
        
        let outputImage = tiltShift(image: inputImage)
       
        completion(outputImage, error)
    }
}

 

호출할때 이런식으로 하셔도 되겠죠.

ayncTiltShift(someImage, runQueue: someQueue) { image, error in
       DispatchQueue.main.async {
              // image처리 관련 코드
       }
}


일반적으로 비동기적인 일이 끝나고 메인 쓰레드로 보낼일이 많으니.. 함수 설계에서, 완료된 콜백함수를 실행시키는 큐를 넣을 수 있도록 만들 었을 뿐입니다.

감사합니다. :)

Hình ảnh hồ sơ của xpflxhfl948142
xpflxhfl948142

câu hỏi đã được viết

Đặt câu hỏi