IOS

    iOS. 디스패치큐(GCD) 사용시 주의해야할 사항

    ⭐️앨런님 강의를 듣고 정리한 글입니다⭐️ 💥디스패치큐(GCD) 사용시 주의해야할 사항 ❓반드시 메인큐에서 처리해야하는 작업 UI관련 처리는 반드시 메인큐에서 처리해야한다 DispatchQueue.global().async{ //코드 1 //코드 2 DispatchQueue.main.async{ //다운로드 한 이미지 표시 코드 self.imageView.image = image // UI 관련 작업들은 메인큐에서 진행 } } //URLSession은 내부적으로 비동기 처리가 되어있음 URLSession.shared.dataTask(with: url){ //코드 1 //코드 2 DispatchQueue.main.async{ //다운로드 한 이미지 표시 코드 self.imageView.image = ima..

    iOS. GCD의 개념과 Dispatch큐(Queue)종류? Qos

    ❓메인 큐 - DispatchQueue.main 메인큐 = 메인쓰레드 직렬로 작동한다. 기본적으로 실행하는 코드는 직렬 + 동기적으로 실행된다. 일반적으로 사용하는 print("123456") 이란 코드는 아래와 같은 의미가 숨겨져 있다. DispatchQueue.main.sync{ print("123456" } ❓글로벌 큐 - DispatchQueue.global() DispatchQueue.global().async{ } 글로벌큐 중 디폴트 기본적으로 동시(Concurrent)큐 여러개의 쓰레드를 사용한다. QoS에 따라서 여러개로 나뉜다. ex) DispatchQueue.global(qos: .utility) ❓QoS (Quality of Service) 서비스의 품질에 따라서 나뉜다. 서비스의 품..

    iOS. 동시성프로그래밍(2) - 동기, 비동기, 직렬, 동기

    💥 비동기(Async) vs 동기(Sync) ❓비동기(Async) 작업을 다른 스레드로 보낸 후 작업이 끝나기를 기다리지 않는다. 기다리지 않기 때문에 다음 작업을 진행할 수 있다. ❓동기(Sync) 다른 스레드에 작업을 시키고, 끝날 때까지 기다린다. 작업이 끝날 때까지 다른 작업을 시작할 수 없다. 💥 직렬(Serial)큐 vs 동시(Concurrent)큐 큐의 특성에 따라 나뉘어짐 ❓직렬(Serial)큐 Queue에서 받은 테스크들을 단 하나의 다른 쓰레드로 보내는 큐 한 번에 하나의 테스크를 순차적으로 실행 순서가 중요한 작업을 처리할 때 Main Thread에서 사용되는 Queue(Main Queue) ❓동시(Concurrency)큐 Queue에서 받은 테스크들을 다른 여러개의 쓰레드로 보내는 ..

    iOS. 동시성(Concurrency) 프로그래밍(1) - 동시성프로그래밍이란? feat. 병렬/동시

    동시성 프로그래밍이 필요한 이유 네트워크 통신과 비동기 처리 네트워크 통신, 서버에 데이터를 요청하는 일은 부하가 많이 걸리는 일이다. 당근마켓의 화면엔 사진과, 정보를 담고 있으며, 이를 스크롤하며 다른 정보들을 갖고있을 수 있다. 비동기 처리를 하지 않으면 한 번에 한 개의 작업만 할 수 있다. 첫번째 사진을 다운로드 -> 첫 번째 정보를 다운로드 -> 두 번째 사진을 다운로드... 그러므로 비동기 처리를 하지않으면 테이블 뷰를 스크롤 할 때 마다 버벅거릴것이다. 아이폰의 메인쓰레드 아이폰의 화면 주사율은 60Hz이다. 1초에 60번 화면을 다시 그린다는 뜻이다. 계산을 해보면 0.01666초에 한 번 화면을 다시 그려야 하며 화면을 다시 그리는 일은 메인쓰레드가한다. 즉 메인쓰레드는 0.01666초..

    iOS . 오토레이아웃 - Aspect Ratio

    Aspect Ratio 화면의 객체의 크기를 비율로 지정할 때 사용 이미지나 제목 등을 다양한 화면에서 고정된 비율의 크기로 보여주기 위해 사용!

    iOS - The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions(Rx 타입추론에러)

    The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions Rx를 공부하다가 발생한 에러. combineLatest와 map을 사용하다가 발생했다. 타입을 추론하기 어려워 빌드할 수 없다는 내용 Observable.combineLatest([redSlider.rx.value, greenSlider.rx.value, blueSlider.rx.value]) .map{ UIColor(red: CGFloat($0[0]) / 255, green: CGFloat($0[0]) / 255, blue: CGFloat($0[0]) / 255, ..

    [iOS] UserDefault를 활용한 저장, struct형태 저장, 구조체 배열 저장, 로드

    UserDefaults의 원리 - 저장: 요청 > struct 객체 > Data형 > 메모리, 디스크에 저장 * 아카이빙: 객체를 Data형과 같이 바이트 형태로 변경하는 작업이며 객체를 메모리, 디스크에 저장할 수 있는 파일 형시으로 만드는 것 - 로드: 요청 > 메모리, 디스크에 저장된 형태 탐색 > Data형 > struct객체로 변환 > 획득 * 언아카이빙: 메모리, 디스크에 저장된 Data형태의 바이트 형태를 스위프트의 struct 객체외 같은 형태로 변경하는것. 기본 타입인 Int, Double, String은 아카이빙, 언아카이빙이 내부적으로 UserDefaults를 사용할 때 적용이 되어서 바로 사용 가능하지만, struct같은 사용자 지정 타입의 경우 아카이빙, 언아카이빙 작업이 별도로 ..

    IOS - Xcode 오류 Application tried to present modally a view controller on itself

    Application tried to present modally a view controller on itself 뷰 컨트롤러를 인스턴스화하고 present하는 과정에서 바보같이 실수 guard let storyboard = self.storyboard?.instantiateViewController(withIdentifier: "stoyboard) as" storyboard else { return } storyboard.modalPresentationStyle = .fullScreen storyboard.present(storyboard, animated: true) 문제는 3번째 라인 storyboard.present(storyboard, animated: true) // 이라인을 아래처럼 수정 ..

    IOS - Xcode 오류 Could not insert new outlet connection: Could not find any information for the class named

    Could not insert new outlet connection: Could not find any information for the class named 무슨에러? 새로운 뷰를 생성하고 클래스 이름을 정확히 입력했으나 발생하는 에러. Xcode의 버그라고.. 해결방법? 방법 1. 해당 클래스에 @IBOutlet을 코드로 선언하고 연결하면 이후에 연결하는 컴포넌트들은 잘 연결됨. 방법 2. Xcode 재시작 방법 3. cmd + shift + k 로 클린빌드

    IOS - Xcode 오류 this class is not key value coding-compliant for the key profileButton.

    IBOutlet문제 @IBOutlet으로 연결해놨으나 삭제/주석 처리한경우 발생 오류가 발생한 Outlet이 위치한 뷰로 이동해서 사용하지않는 Outlet의 연결을 끊어주면 해결