-
카테고리
-
세부 분야
모바일 앱 개발
-
해결 여부
해결됨
동기적 함수를 비동기적 함수로 바꾸는 부분에서 질문 있습니다
22.11.19 22:23 작성 조회수 151
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에서 다시 한번 더 비동기로 돌아가게 만드는 이유가 무엇인가요?
강의 너무 잘 듣고 있습니다 :)
iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
1) 반드시 메인큐에서 처리해야하는 작업 2) sync메서드에 대한 주의사항 3) weak, strong캡처 주의 4)컴플리션핸들러의 존재이유 5) 동기적함수를 비동기함수 처럼 만드는 방법
강의실 바로가기
답변을 작성해보세요.
2
2
앨런(Allen)
지식공유자2022.11.19
안녕하세요 본성 님!
원하시면 굳이 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처리 관련 코드
}
}
일반적으로 비동기적인 일이 끝나고 메인 쓰레드로 보낼일이 많으니.. 함수 설계에서, 완료된 콜백함수를 실행시키는 큐를 넣을 수 있도록 만들 었을 뿐입니다.
감사합니다. :)
답변 2