• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    해결됨

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

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에서 다시 한번 더 비동기로 돌아가게 만드는 이유가 무엇인가요?

 

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

답변 2

·

답변을 작성해보세요.

2

구본성님의 프로필

구본성

질문자

2022.11.20

빠른 답변 감사합니다!

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처리 관련 코드
       }
}


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

감사합니다. :)