해결된 질문
작성
·
217
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에서 다시 한번 더 비동기로 돌아가게 만드는 이유가 무엇인가요?
강의 너무 잘 듣고 있습니다 :)
답변 2
2
2
안녕하세요 본성 님!
원하시면 굳이 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처리 관련 코드
}
}
일반적으로 비동기적인 일이 끝나고 메인 쓰레드로 보낼일이 많으니.. 함수 설계에서, 완료된 콜백함수를 실행시키는 큐를 넣을 수 있도록 만들 었을 뿐입니다.
감사합니다. :)