본문 바로가기

IT

iOS Concurrency 프로그래밍, 동기/비동기 처리, GCD/Operation 에 대한 이해 (9) 9. GCD 관련 총정리 GCD 와 관련된 내용을 아래와 같이 순서대로 설명을 진행했다. 목차를 보고 GCD와 관련된 내용이 어떤 것이 있는지 파악을 하고 상세 내용은 각 단원별로 강의를 다시 한번 보면서 확인하면 될 것이다. 더보기
iOS Concurrency 프로그래밍, 동기/비동기 처리, GCD/Operation 에 대한 이해 (8) 8. lazy var와 관련된 이슈들 lazy var 의 경우 사용이 되는 시점에 메모리에 해당 값이 올라가는데 그 시간이 오래 걸리다 보니 여러 스레드에서 접근을 할 경우 여러 값들이 생성되는 문제가 발생할 수 있다. 예제는 아래와 같다. 위와 같이 lazy var 를 사용할 경우 Thread-safe 하지 못한 상황에 놓이게 되고 이를 해결하기 위한 방법은 아래와 같이 4가지가 있다. 위의 방법들을 통해서 어떻게 lazy var 문제를 해결하는지 예제는 아래와 같다. lazy var의 문제를 해결하는 방법 → 1. 시리얼큐 + sync (엄격한 Thread-safe) lazy var의 문제를 해결하는 방법 → 2. Dispatch Barrier 적용 (조금 더 효율적인 방법) lazy var의 문제를.. 더보기
iOS Concurrency 프로그래밍, 동기/비동기 처리, GCD/Operation 에 대한 이해 (7) 7. 심화. Thread-safe한 코드의 구현과 방법 앱스토어 출시전에는 반드시 잠재적 경쟁 상황에 놓여있는지 점검해야한다. 그리고 Xcode에서 제공하는 기능인 TSan을 사용하면 잠재적 경쟁상태에 놓인 코드를 찾을 수 있다. 사용방법은 아래와 같다. 2) 시리얼큐와 sync 개발을 하다보면 Thread-safe 를 보장하기 위해서 시리얼큐.sync 를 사용해야하는 상황이 발생한다. 그리고 해당 예제는 아래와 같다. Thread-safe 하지 않은 상황의 예제는 아래와 같다. → Xcode 파일로 예제 코드를 제공해줬다. Thread-safe 한 상황의 예제는 아래와 같다. → Xcode 파일로 예제 코드를 제공해줬다. 위와 같이 코드를 작성할 경우 2,3,4번 작업에 명명된 print 함수들이 순차.. 더보기
iOS Concurrency 프로그래밍, 동기/비동기 처리, GCD/Operation 에 대한 이해 (6) 6. 심화. 동시성과 관련된 문제 2개 이상의 쓰레드를 사용하면서, 동일한 메모리 접근 등으로 인해 동시성과 관련된 문제가 발생한다. 다른말로 Thread-Safety 하다고 한다. Thread-safe(쓰레드 세이프) : 여러 쓰레드가 동시에 쓰여도 안전하다는 의미이다. → 동시적으로 처리를 하면서 (여러 스레드를 사용하면서도) 문제없이 스레드를 안전하게 사용가능하다는 의미이다. 데이터(객체나 변수 등)에 여러 쓰레드를 사용하여 접근하여도, 한번에 한개의 쓰레드만 접근 가능하도록 처리하여 경쟁상황의 문제없이 사용할 수 있다는 것이다. 동시성 문제는 크게 아래와 같이 3가지로 나뉘어진다. Race Condition (경쟁 상황) Deadlocks (교착 상태) Priority Inversion (우선 순.. 더보기
iOS Concurrency 프로그래밍, 동기/비동기 처리, GCD/Operation 에 대한 이해 (5) 5. 실제 GCD 프로젝트 사례를 통한 활용 실제 iOS 앱을 만들다 보면 GCD를 활용하는 경우가 많은데 그 사례를 아래와 같이 정리하여 살펴보았다. 위와 같이 컬렉션뷰의 각각의 셀이 네트워크 통신을 통해 받아온 이미지 등을 비동기적으로 뷰에 셋팅을 함에 따라 GCD 에 대한 내용을 유의해서 사용해야한다. 아래 예제를 보면서 상세 내용을 살펴보자. 만약 메인쓰레드에서 이미지를 다운받고 보여주는 작업까지 처리를 할 경우 앱이 버벅이는 현상이 발생한다. 더보기
iOS Concurrency 프로그래밍, 동기/비동기 처리, GCD/Operation 에 대한 이해 (4) 1) 디스패치 그룹의 개념 디스패치 그룹을 왜 필요한지를 이해하기 위해서는 아래의 그림과 실제 앱에서 이뤄지는 사례들을 보면 이해할 수 있다. 아래 내용을 확인해보면 하나의 목적성을 가지는 작업들을 묶고 해당 작업들이 끝나는 시점에 무엇인가를 실행줘야한 경우가 있다. 예를 들어 아래와 같이 런치스크린에 진입한 이후 메인화면으로 갈 때 각 컬렉션뷰 셀에 담긴 이미지 값들이 비동기적으로 다운을 해오다보니 다운이 안되서 표현이 안되는 경우가 발생할 수 있다. 이런 경우에 디스패치 그룹을 사용해서 모든 셀들에서 이미지를 다운 받은 시점에 화면을 전환하는 작업을 수행할 수 있다. 그리고 디스패치 그룹을 쓰는 방법은 아래와 같다. 디스패치 큐를 통해서 여러 작업들을 생성하고 해당 작업들은 그룹에다 넣으면 된다. 그.. 더보기
iOS Concurrency 프로그래밍, 동기/비동기 처리, GCD/Operation 에 대한 이해 (3) 1) 반드시 메인큐에서 처리해야하는 작업 ★ 중요하게 알아야할 한가지 개념 ★ UI 관련일들은 “메인큐”에서 처리해야 한다. → 화면을 그리는 일 UI 업데이트가 어떻게 이뤄지는지 아래 개략도를 보면 된다. 모든 OS에서 화면을 업데이트하거나 표시하는 UI 작업을 하나의 쓰레드에서만 작업해야하는 특징이 있어서 메인 스레드에서 처리해야한다. → 애플에서 왜 이렇게 만들었는지 확인할 필요가 있음 2) sync 메서드에 대한 주의사항 sync 메서드와 관련해 절대 해서는 안되는 코드 2가지가 있다. 1. 메인큐에서는 다른큐로 작업을 보낼때 sync 메서드를 부르면 절대 안된다. 메인큐에서는 항상 비동기적으로 보내야한다. 즉, UI와 관련되지 않은 오래 걸리는 작업(네트워크)들은 다른 쓰레드에서 일을 할 수 있.. 더보기
iOS Concurrency 프로그래밍, 동기/비동기 처리, GCD/Operation 에 대한 이해 (2) 2. 디스패치큐(GCD)의 종류와 특성 iOS에서는 메인 쓰레드의 일을 다른 쓰레드로 보내서 처리할 떄 쓰레드를 직접적으로 관리하는 것이 아닌 중간에 큐라는 매개체를 사용하여 작업을 분배하는 작업을 한다. 그리고 큐의 종류는 크게 2가지로 GCD와 Operation 으로 나뉘어진다. 그리고 GCD를 세분화하면 메인, 글로벌, 프라이빗(커스텀) 3가지로 나뉘어진다. 큐에 대한 개략도는 아래와 같다. GCD 큐의 3가지 세분화가 이뤄진다는 것은 즉, 대기열의 종류가 여러개라는 것을 의미한다. 그리고 이말은 대기열 종류가다 특성이 조금씩 다르며 작업의 특성, 원하는 일처리에 따라 대기열(큐)의 특성에 맞게 작업을 보내면 된다. 그리고 원하는 큐들에 작업을 보내게 되면 각 큐들은 각자 쓰레드를 만들어서 작업들을.. 더보기