인프런 커뮤니티 질문&답변

이동준님의 프로필 이미지
이동준

작성한 질문수

앨런 iOS Concurrency(동시성) - 디스패치큐와 오퍼레이션큐의 이해

2) 오퍼레이션큐(OperationQueue)

2) 오퍼레이션큐(OperationQueue) 강의 질문입니다

작성

·

22

0

2) 오퍼레이션큐(OperationQueue) 강의 15분37초 쯤 보면 필터 작업이 다 끝난다음에 append큐를 통해서 배열에 전달을 한다고 말씀하셨어요. 근데 여기 필터하려는 이미지가 5장이잖아요, 5장 모두 필터링 다 끝나고 나면 배열에 들어가는건가요 아니면 ,filterQueue는 기본적으로 동시적으로 동작하면서 각 필터 작업이 끝나는 대로 배열에 넣는건가요? filterQueue.waitUntilAllOperationsAreFinished() 코드 보면 동기(sync)적으로 동작하게 하니까 전자가 맞는거 같아보여요

답변 2

1

앨런(Allen)님의 프로필 이미지
앨런(Allen)
지식공유자

네 동준 님! 안녕하세요!

여기서는 모두 필터링 다 끝나고 나면 배열에 들어가는 건 아니고,
각 필터작업이 끝나는 대로 배열에 넣는 것이예요!


completionBlock 에 할당해주는 클로저의 경우, 각 필터작업(오퍼레이션)이 끝난 후에.. 무엇을 할 것인지, 정해주는 부분입니다.

그리고, 해당 코드 전체에 반복문으로 감싸진 것을 보실 수가 있는데..
이는 TiltShift 오퍼레이션 작업이 5개가 생성이 되고, 물론 결론적으로 생성된 5개의 오퍼레이션을 하나의 쓰레드만 가진 filterQueue에 순차적으로 넣어주고 있는 것을 보실 수가 있는데,

어쨌든.. completionBlock의 클로저는 filterQueue에 설정해주는 것이 아닌, 각 filterOp(오퍼레이션)에 설정해주고 있는 것을 보실 수 있어요.
따라서, 당연히 각 오퍼레이션 작업이 끝날때 수행하는 일이겠죠.


혹시, 다른 궁금증이 생기시면 또 질문주세요!

고맙습니다. :)

0

안녕하세요, 인프런 AI 인턴입니다. 이동준님.

오퍼레이션큐(OperationQueue)에서의 동작 방식에 대해 질문해주셨네요. 질문하신 내용에 대한 답변과 함께 관련 정보를 드리겠습니다.

filterQueue는 기본적으로 동시적으로 동작하는 큐입니다. 즉, 여러 작업을 동시에 실행할 수 있습니다. 하지만 filterQueue.waitUntilAllOperationsAreFinished()를 사용하면 모든 작업이 완료될 때까지 현재 스레드를 일시 정지시키므로, 이 메서드를 호출했을 때는 모든 필터링 작업이 끝난 이후에 다음 단계가 진행됩니다.

즉, 필터링된 이미지를 배열에 넣는 작업은 각 필터 작업이 끝난 순서로 큐에 도착하게 됩니다. 하지만, waitUntilAllOperationsAreFinished()가 호출된 시점에서는 모든 필터링 작업이 이미 완료된 상태이기 때문에, 결과 배열에는 모든 이미지가 필터링되어 이미 포함되어 있습니다.

추가적으로 오퍼레이션 큐와 관련하여 동시성 처리에 대한 더 깊이 있는 설명을 원하시면 다음 질문들을 참고하시면 도움이 될 것입니다:

이해가 되셨기를 바라며, 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

이동준님의 프로필 이미지
이동준

작성한 질문수

질문하기