[iOS] StackView를 사용한 채팅 UI 구현
·
iOS/쫌쫌따리 트러블슈팅
채팅앱을 만들면서 채팅 UI를 어떻게 그려야할지에 대한 트러블 슈팅프로필 영역과 닉네임은 고정으로 값이 있는 영역이고 채팅은 케이스가 세개임1. 텍스트만 있는 경우2. 이미지만 있는 경우3. 텍스트 + 이미지가 함께 있는 경우  텍스트 영역 & 하단 이미지 영역을 하나의 스택뷰로 감쌈 스택뷰를 사용한 이유처음에는 스택뷰를 사용하지 않고 UI를 작성하였는데텍스트만 있는 경우나 이미지만 있는 경우에 제약조건을 재설정해주어야 하는 번거로움이 있었음그에 따라서 시간을 나타내는 Label에 대한 제약조건도 변경되어야 하기 때문에 상당히 번거롭게 느껴짐  스택뷰를 사용하면 텍스트 or 이미지가 없는 경우 그냥 Hidden만 시키면 됨또 스택뷰의 Bottom과 시간 Label의 bottom을 맞춰놓으면 스택뷰의 크..
[iOS] StackView의 Distribution과 Alignment
·
iOS/iOS 지식
StackView 알아보기 전에 먼저 알아야할 개념Content Hugging Prioritoy  & Content Compression Resistence Priority Label 두개를 일렬로 놓은 상황에서 오토레이아웃을 잡으면 문제가 생김 Content Hugging Prioritoy공간이 남을 경우 적용우선순위가 높은 뷰는 본인 공간 유지우선순위가 낮은 뷰가 남은 공간을 차지 Content Compression Resistance Priority공간이 부족할 경우 경우 적용우선순위가 높은 뷰는 본인 공간 유지우선순위가 낮은 뷰가 남은 공간을 차지오른쪽 Label의 Content Hugging Priority를 높이면 오른쪽은 본인 크기만큼 유지왼쪽 Label은 남은 공간만큼 늘어남 공간을 좁게 ..
Swift Concurrency(2) - Continutation
·
iOS/iOS 지식
Continuation이라는 개념이 있음이전에 Swift Concurrency에서 wait-resume을 통해 쓰레드의 제어권을 시스템에 반환하고 돌려받는 과정이 있다고 했음! 여기서 작업이 재개될 때 스레드는 변할 수 있음 왜냐하면 애플이 스레드 관리를 시스템에서 하기 때문에 추가적인 스레드의 생성 없이 적절한 스레드를 배정해주기 때문임이 과정이 있기 때문에 Swift Concurrency는 스레드 익스플로전을 방지할 수 있다고 볼 수 있음 스레드 익스플로전은 뭔가요?CPU 코어보다 스레드의 수가 많아지는 것을 말함스레드가 과도하게 생성되면 일 많이 하고 좋은 거 아닌가요? 라고 생각할 수 있음하지만 과한 스레드 생성은 빈번한 컨텍스트 스위칭으로 인한 오버헤드나, 블락된 스레드를 기다리면서 가지고 있는..
Swift Concurrency(1) - Async와 Await
·
iOS/iOS 지식
Swift Concurrency는 동시성 프로그래밍을 가능하게 해줌 동시성 프로그래밍은 뭘까요?스위프트에서는 동시성을 "비동기 및 병렬코드의 일반적인 조합"이라고 지칭한다고 함  비동기가 뭔가요..?네트워크나 파일 구문분석같은 경우에는 시간 소요가 많음이런 작업들이 계속되는 동안 UI업데이트와 같은 작업을 계속 진행할 수 있고, 이것을 비동기로 수행된다고 함 그럼 병렬코드는 뭐에요..? 여러 코드가 동시에 실행됨을 의미함. 코어가 4개라면 이 네개에서 코드의 실행이 동시에 일어남 근데 GCD를 쓰면 우리가 DispatchQueue를 통해서 동시성 프로그래밍을 할 수 있는데 왜 Swift Concurrency를 쓸까이유가 여러개로 알고 있지만 오늘은 사용적인 관점만 보도록 하겠음!! 평소에 사용하던 URL..
[Swift] Protocol(1) - (some과 any는 왜 필요할까?)
·
iOS/iOS 지식
Swift에서는 Protocol이라는 일급객체가 있음!Protocol이 뭐에요? 라고 물어보면 어떻게 대답할 수 있을까.. 상당히 모호함공식문서에 따르면 프로토콜은 특정 유형이 구현해야 하는 요구사항의 정의임특정 작업이나 기능에 맞는 메서드, 속성, 요구사항의 청사진이라고 함예를 들어서 "동물"이라는 프로토콜이 있다고 해보면 동물은 닭도 있고 소도 있고.. 매우 다양함이 동물들은 "먹이를 먹는다"라는 공통의 동작이 있고, 이 동작을 일관되게 수행함그렇기 때문에 프로토콜로 eat이라는 요구사항을 정의하고, 채택한 곳에서 해당 함수를 각각의 동물에 맞게 구현할 수 있음protocol Animal { func eat()}struct Cow: Animal { func eat() { pri..
[Swift] Struct와 Class (1) - Class 안에 Class, Struct 안에 Class
·
iOS/iOS 지식
https://blog.datepop.co.kr/ios-interview-2024-1/  위의 글을 보고 해당 주제에 대해 작성하는 글임을 밝힘 아래코드는 해당 블로그에 작성된 코드이고, 약간 수정해서 공부해봄구조체와 클래스의 차이가 뭐에요? 라고 물어보면 한가지만 정확하게 말할 수 있음구조체는 값타입이고 스택에 저장됨. 클래스는 참조타입이고 힙에 저장됨.그러면 또 이런 질문을 해보겠음. 그럼 클래스 안에 구조체가 있으면? 구조체 안에 클래스가 있으면 그건 뭔가요?일단 1탄에서는 클래스 - 클래스, 구조체 - 클래스에 대해서 다뤄보도록 하겠음final class EmptyClass {}struct HugeStruct { var emptyClass = EmptyClass() var emptyCl..
[iOS] ViewController 생명주기(2) - 실험
·
iOS/iOS 지식
https://bokch-jm.tistory.com/119 을 이어서 작성하는 글임!iOS에서는 다양한 화면전환 방식이 있고, 이에 따라 생명주기 호출이 다르게 일어남.그러면 이럴땐 어떻고 저럴땐 어떻고를 로그로 한 번 찍어보도록 하겠음1. 모달방식 - 화면을 전체 다 덮지 않을 경우Main viewWillAppear(_:)Main viewDidAppear(_:)일단 첫화면부터 어떤 함수가 호출될까를 생각해보겠음탭바의 루트뷰이기 때문에 로드가 되어있는 상황임viewDidLoad가 호출되지 않고, 그 이후의 함수들만 호출됨그러면 탭바에 임베디드 되어있지 않고, 첫 화면이 보여지는 경우엔 어떤게 호출될까?당연히 viewDidLoad부터 나옴Main viewDidLoad()Main viewWillAppear(..
[iOS] GCD Priority Inversion (우선 순위의 뒤바뀜)
·
iOS/iOS 지식
오늘도 어김없이 오류를 내었음. 높은 우선순위의 작업(User-initiated)이 낮은 우선순위 작업(default)을 기다리고 있으니까 이 우선순위 역전을 피할 수 있는 방법을 찾아라 뭐 그런거 같음오류를 보면 Data(ContentsOf)에서 나는 것을 볼 수 있었음. Thread Performance Checker: Thread running at User-initiated quality-of-service class waiting on a lower QoS thread running at Default quality-of-service class. Investigate ways to avoid priority inversions[NSData(NSData) initWithContentsOfURL:..
[iOS] 네트워크 연결 감지 해보기
·
iOS/iOS 지식
프로젝트 중에 네트워크가 끊어지는 상황에 대해서 생각해 보게 되었음 네트워크가 켜져 있지 않거나 비행기모드라면, 네트워크 연결이 필요한 부분(API 콜을 한다던가, 사진을 다운받는다던가) 하는 곳에서 에러가 날 것임. 하지만 이 부분에 대해서 예외처리가 되지 않는다면 사용자 경험측면에서 좋지 않다는 생각을 했음 그래서 네트워크 단절에 대한 처리를 해보게 되었음일단 아래와 같은 NetworkView를 만들고 네트워크 통신이 일어나는 모든 뷰 컨트롤러에 추가해놓았음그리고 아래와 같이 별도로 NetworkMonitor 클래스를 만들어서 startMonitoring을 호출하는 시점부터 계속해서 네트워크 상태를 감지하도록 했음import Foundationimport Networkfinal class Networ..
[WWDC2020] Advances in UICollectionView
·
iOS/iOS 지식
ColelectionView를 구성하는 API는 3가지의 카테고리로 나눌 수 있음Data / Layout/ Presentation임. 데이터를 어떤 레이아웃으로 어떻게 표현해줄 것인가? 대충 뭐 그런것같음iOS6에 처음 도입되었을 때 데이터는 "indexPath"기반의 UICollectionViewDataSource 프로토콜 기반으로 관리되었음그리고 Layout에는 UICollectionViewFlowLayout을, Presentation쪽에는 UICollectionViewCell이나UICollectionViewReusable을 제공했다고 함.자 그 다음 iOS13에는 Data와 Layout 에 DiffableDataSource, CompositionalLayout을 도입함iOS14에서는 세가지 카테고리..