티스토리 뷰

728x90
반응형
  • 데드락(두 개 이상의 작업이 서로 작업이 끝나기 만을 기다리고 있기 때문에 아무것도 완료가 안됨)에 빠져서 에러가 호출됩니다.
  • 예를 들어, IBAction 블럭 안에서 sync 를 호출하게 되면 IBAction 블럭이 반환되기 전까지 main.sync 블럭은 큐에 삽입되지 않습니다. 이렇게 되면 IBAction 블럭은 main.sync 가 실행되지 않으니 멈추고, main.sync 블럭은 동기적으로 삽입되기 때문에 기다리게 되면서 멈춥니다.
  • 명시적으로 스레드를 지정하지 않을 경우 main 스레드에서 task 가 실행됩니다.
// 즉, 위의 경우는 아래의 코드와 동일한 구조를 가집니다.
DispatchQueue.main.async { // outer 
    DispatchQueue.main.sync { // inner
        // outer block 이 종료되기 전까지 main queue 에 task 를 삽입하지 않는다.
    }
    // inner block 이 종료되기 전까지 outer block 은 종료되지 않는다.
}

👉 main.sync 는 정말 실행이 안될까?

    • background 스레드에서 작업들을 순서대로 UI 업데이트해야할 때 사용 가능.
    • 애플 문서에서 사용한 것 봄.

비슷한 원리로 이중 큐 구조에서 같은 큐에서 sync 로 작업을 추가하는 경우. 안쪽에 있는 queue 가 sync 일 경우도 에러이다.
해당 sync 블럭을 감싸는 것이 종료되어야 sync 블럭이 큐에 추가되는데 큐에 추가가 되지 않으니 종료도 되지 않는 것이다.

728x90
반응형
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
링크
Total
Today
Yesterday