ios 31

[SwiftUI] 뷰의 성능 개선(2) - 뷰의 slow update 개선 | WWDC23. Demystify SwiftUI performance

> 뷰의 성능 개선 시리즈[SwiftUI] 뷰의 성능 개선(1) - Dependency 관리[SwiftUI] 뷰의 성능 개선(2) - 뷰의 slow update 개선[SwiftUI] 뷰의 성능 개선(3) -Identifier의 중요성  이번 글은 뷰 성능 개선 (1), (3) 보다는 간단한 글이 될 것 같다. 근데 실제 프로젝트에 대한 성능을 개선할 때 고려해야 할 점을 언급한 부분이 있어서 작성해 본다.   첫 번째 성능 개선 글에서는 dependency와 뷰의 업데이트 "횟수"에 초점을 맞췄다면, 이 글에서는 뷰가 업데이트 될 때 사용되는 비용을 줄여 "속도"를 개선하는 것에 초점이 있다.  📍 반응성 저하(reduced responsiveness)뷰가 느리게 업데이트 되는 것이 어떤 문제가 있길래..

SwiftUI 2024.11.30

[Swift] SwiftUI에서 some View를 사용하는 이유 | any VS some

왜 SwiftUI에서는 some View를 사용해서 뷰를 그려요? some 키워드가 Opaque Type에서 사용되고 Opaque Type에 대한 개념도 어느 정도 알고 있지만, 어느 날 문득 왜 SwiftUI에서는 any View도 아니고 some View로 뷰에 대한 타입을 리턴 받아 사용하는 걸까 궁금했다.    이렇게 some 키워드로 나타내는 타입을 Opaque Type이라고 하는데, 불명확 타입이라고도 불리며, 역제네릭 타입으로도 불린다. 왜 불명확 혹은 역제네릭 타입으로 불리는지 Opaque Type에 대해 살펴보고, 왜 SwiftUI에서 뷰를 그릴 때는 some View 처럼 Opaque Type을 사용하는지에 대해서도 알아보자!    📍Generic 왜 Opaque Type 알아본다고 ..

Swift 2024.11.14

[Swift] any 키워드는 왜 있는걸까? Existential Type은 뭔데?

some과 any를 공부하다 보니 any라는 키워드가 등장한 이유가 궁금해졌다.궁금증이 의식의 흐름처럼 생기는 편.. ㅎㅎ  any 키워드에 대해서 공부하다보니 Existential type 이라는 것까지 공부하게 되었는데 Existential type의 특성과 함께 swift 5.6에서 any 키워드가 등장한 이유에 대해서도 알게되어 흥미로워 글을 적는다. Swift를 공부하면서 Existential 이라는 단어는 Existential Container 공부할 때 밖에 못 봤는데 (프로토콜 타입의 인스턴스를 저장하는 방법에 대한 내용) 역시나 이번에도 프로토콜에 관련한 내용이었다. Existential Container 에 대한 내용이 궁금하다면 아래 블로그 글로!프로토콜 채택한 구조체 Existent..

Swift 2024.10.31

[RxSwift] 메모리 누수 일어나기 딱 좋은(?) .bind(with:onNext:) & 중첩 클로저의 객체 참조

📍.bind(with:onNext:)의 메모리 누수? 메모리 누수 방지하려고 쓰는 RxSwift의 .bind(with:onNext:) 모두 알고 계신가요?객체에 대한 retain 없이 참조하기 위해 .bind(with:onNext:) 쓰는데 제목에 뭔 메모리 누수 일어나기 딱 좋다고 하는거냐!! 라고 할 수 있는데요.     프로젝트를 하다가 어느 날보니 뷰컨트롤러에 deinit이 찍히지 않는 이슈가 있었습니다.혹시 이 코드에서 이상한점이 보이시나요???   onNext 클로저의 파라미터 이름으로 owner 가 있는데 클로저 내부에 self…도 사용되고 있네요?뭔가 어색하지 않나요??        우선 .bind(with:onNext:)가 뭔지 정확히 알아보기 위해 RxSwift의 .bind(with:..

RxSwift 2024.09.09

[RxSwift] Hot&Cold Observable

ReactiveX를 공부하다 보면 한 번쯤은 만나게 되는 개념 Hot&Cold Observable, 문서에서도 Observable설명하는 부분에서 대문짝만하게 적어놓은 걸 보니 중요한 개념인 듯싶어서 공부해 보았다!  단순하다면 단순한 개념이지만, ReactiveX에서 등장하는 다른 개념들과 복합적으로 생각하다 보면 이게 이해가 잘 된 건가.. 싶어서 보고 또 보고 해서 이해하는데 며칠이 걸렸다면 믿으시겠습니까.. https://reactivex.io/documentation/observable.html ReactiveX - ObservableObservable In ReactiveX an observer subscribes to an Observable. Then that observer reacts ..

RxSwift 2024.08.29

[RxSwift] Observable stream 에서 share가 필요한 이유 | multiCast, uniCast

RxSwift는 사용하다 보면 참 편리한 아이인 것 같다. 반응형으로 사용자의 이벤트를 구독하고 방출된 이벤트를 관찰하고 있다가 처리해주다 보니 MVVM 패턴과도 찰떡인 게 사용하면서 체감된다. 하지만 우리가 이벤트를 방출할 때 사용해주는 Observable이 편리하긴 하지만 여러 곳에서 구독을 할 경우 유의해주어야 할 점이 있는데 이것에 대해 알아보자! ReactiveX를 공부할 때 반드시 알아야할 multicast, unicast 개념과도 연결되니 꼭 알고 넘어가기로!       📍 Observable Stream 우리는 이미 Observable를 여러번 구독할 수 있다는 것을 알고 있는데... 근데 이렇게 여러번 구독하게 되면 각각 구독하는 시점에 Observable stream이 새롭게 생긴다...

RxSwift 2024.08.23

[iOS] App Thinning 앱 씨닝과 Slicing, On-Demand Resource, Bitcode

에셋 카탈로그에 등록하는 1X, 2X, 3X 이미지 크기에 대해 정리하며앱 씨닝에 대한 글도 곧 쓰겠다고 한지 어언 3주가 되어 가는ㅎㅎ  ((1x, 2x, 3x에 대해서도 궁금하다면 이 글을 보고오기로 해욤))[iOS] image asset의 크기 1x ,2x, 3x 사용하는 이유 | scale factor, 해상도(Resolution), pixel, point  귀찮은 거 아니고 bitcode란 아이를 이해하느라 쫌 늦었습니다.. (( 근데 이제 공부를 다 하고 나서 Xcode14부터는 애플에서 bitcode에 대한 지원을 하지 않기로 했다고 한 것을 봐버렸는데요조금은 허무한 결과를 맞이했지만 그래도 좋은 공부였따.. ))  여튼 오늘은 App Thinning에 대해 이야기를 해볼 거고 어떤 어떤 기..

iOS 2024.06.08

[Swift] 날짜를 포맷팅하는 또다른 방법 .formatted() | DateFormatter말고 formatted 사용해보자 ( + FormatStyle)

swift에서 날짜를 표현하고 싶을 때는 보통 DateFormatter를 사용해서 Date 인스턴스를 String으로 변환시키거나 날짜형식을 가진 String을 Date 인스턴스로 변환시키곤 했죠  근데 넘 당연하게 써와서 귀찮은지 모르고 썼지만 생각해 보면- DateFormatter 인스턴스 만들고- dateFormat 지정해 주고- 그 외 원하는 locale, timeZone 등의 프로퍼티를 지정해 주는 등  좀 고통스러웠을 수도 있어요?    그래서 date를 String으로 좀 더 쉽게 변환시킬 수 있다는 컨셉으로 등장한 메서드가 Date의 formatted 메서드인데요! formatted 메서드는 iOS15부터 제공하고 뒤에서도 언급하겠지만 Float, Int, Sequence 등에서도 추가되어..

Swift 2024.05.29

[Swift] 프로토콜 뽀개볼까 (5) | Identifiable

Identifiable, 직역하면 "식별 가능한"근데 도대체 무엇을 식별 가능하게 할 것일까? 뭔가 느낌이.. 앞서 살펴봤던 프로토콜들처럼 커스텀 타입들에 대한 것일 거 같은데..맞습니당!! 인스턴스가 고유한 식별자를 갖게 되는 과정을 살펴봅시다~    보통 우리가 인스턴스를 비교하고 싶을 때 Equatable를 채택하고 == 연산자를 사용해서 비교한다.struct Computer : Equatable{ let name : String let serialNumeber : String let price : Int}let computer1 = Computer(name: "computer1", serialNumeber: "000001", price: 100)let computer2 = Comp..

Swift 2024.05.10

[Swift] 프로토토콜 뽀개볼까 (4) | Hashable, HashTable

set, dictionary가 해시테이블로 만들어져서 배열의 검색보다 빠르다는 이야기를 들어본 적이 있나요?set, dictionary가 해시테이블로 저장되기 위해서는 hashable해야하는데,  이 해시테이블이란 무엇이고 값들이 어떻게 저장되며, hashable은 도대체 무엇인지 알아보자!! # HashTableHah Table은 간단하게 말하면 (key,valye)형태로 데이터를 저장하는 자료구조입니다만,,,전혀 간단하지 않단말임.. 1) key를 해시 함수에 넣어2) 고유한 인덱스를 만들어서3) 배열의 해당 인덱스에 value값을 집어넣는 원리 라고 일단 머릿속에 넣어놓고 천천히 생각해 보자!    (key,valye)형태라고 하면 swift에서 가장 먼저 생각나는 건 아마 딕셔너리 Dictiona..

Swift 2024.05.09