[iOS] UIResponder(1)
2023. 11. 10. 22:45
iOS/iOS
"UIResponder 객체"들은 앱 내의 "User Interaction으로 일어난 Event"에 반응하고 처리한다. 많은 UIKit의 객체들이 Responder인데, 대표적으로 UIApplication, UIViewController, UIView(UIWindow)이 있다. Event Swift에서 User Interaction을 통해 일어난 Event들에는 다양한 타입이 존재하는데, touch: 스크린을 터치 motion: 흔드는 것과 같은 device의 모션 remote-control: 에어팟에서 두 번 터치와 같은 원격제어 이벤트 press: 전원버튼과 같은 물리적인 버튼을 눌렀을 경우 등등이 있다. 더 자세한 정보는 공식문서를 참고바란다. "Responder"는 이러한 이벤트의 타입별로 다양한..
[iOS] Custom Drop Down
2023. 10. 31. 00:18
iOS/iOS
이번 포스팅에선 다음과 같은 DropDown View를 구현해 보자.이후, UIResponder의 firstResponder를 활용해 리팩토링했습니다. 리팩토링한 포스팅을 아래 링크에 있습니다. https://seokyoungg.tistory.com/85 [iOS] Custom Drop Down (2) - firstResponder 활용해 리팩토링하기이전 포스팅에선, Custom DropDown을 구현했었다. 우선, DropDownView를 살펴보면 다음과 같다. "AnchorView를 터치"하게 되면 DropDownView는 TableView를 display 한다. "TableView에서 옵션을 선택"하거나, "외부 영역seokyoungg.tistory.com 전체 코드는 여기에서 확인해 볼 수 있..
[iOS] LocalDB(3) - Core Data CRUD
2023. 10. 25. 17:11
iOS/iOS
"Core Data"는 Database가 아니라 Object Graph Management이다. Core Data는 다양한 기능들을 제공하는데, 제공하는 기능에는 Persistent, Change Tracking과 같은 기능들이 있다. 즉, Persistent는 제공하는 기능 중 하나일 뿐이지, Core Data는 Database가 아니다. 해당 블로그에서 사용하는 예시는 아래 링크에서 자세하기 볼 수 있다. https://github.com/jungseokyoung-cloud/iOS-Study/tree/main/CoreData-Demo Core Data Model Core Data를 사용하기 위해선, App의 Object구조를 정의하는 "Core Data Model File"을 생성해야 한다. "Cor..
[iOS] Local DB(2) - Core Data Concept
2023. 10. 9. 21:27
iOS/iOS
지난 포스팅에서 알아본 UserDefaults, Keychain은 큰 데이터를 저장하기에는 적합하지 않다. "UserDefaults"는 Memory에 캐싱하기 때문에 메모리 부족으로 이어질 수 있고, "Keychain"의 경우에는 Apple에서 민감한 데이터를 위해 제공하기 때문에 적합하지 않다. 이번 포스팅에선, 좀 더 큰 데이터를 저장하기 적합한 Core Data에 대해서 알아보자. Core Data "Core Data"는 Application의 Model Layer의 객체를 관리하는 Framework다. 정확히 말하자면, Core Data는 Database가 아니고, Object Graph Manager이다. Object Graph Manager Object Graph란, 말 그대로 Object간의..
[iOS] Local DB(1) - UserDefaults, Keychain
2023. 10. 4. 18:27
iOS/iOS
"Local DB"란 어플리케이션과 동일한 시스템에 있는 데이터베이스이다. 즉, 어플리케이션을 사용하는 핸드폰 혹은 테블릿 내에 위치한 저장소이다. 어플리케이션에서 매번 서버로부터 데이터를 가져오게 되면 엄청난 네트워킹 딜레이를 겪게 된다. 예를 들어, 카카오톡의 경우 친구목록을 항상 서버로부터 불러온다면, 해당 View에 접근할 때마다 친구목록을 fetch해오는 딜레이를 겪게 된다. 하지만, 이를 Local DB에서 fetch해오게 된다면 네트워킹 딜레이가 사라지게 된다. 이번 포스팅에선 Swift의 LocalDB 중 주로 간단한 형식의 데이터만 저장할 때 사용하는 "UserDefaults", "Keychain"에 대해서 알아보자. UserDefaults "UserDefaults"는 Single Ton..
[WWDC] Understanding Swift Performance(3) - Generic Code
2023. 8. 8. 02:59
iOS/Swift
이번 포스팅에선 Generic을 사용할 때 Method Dispatch는 어떻게 동작하는지, Generic Type의 변수는 어떻게 저장되고 Copy되는지 알아보자. Generic Method Mechanism 왼쪽은 Drawable의 Protocol Type을 파라미터로 전달받는 함수이고, 오른쪽은 Drawable Type을 만족하는 Generic Type을 파라미터로 전달받는 함수이다. 별반 다를게 없어 보이지만, Geric코드는 Parametric Polymorphism(다형성)이라 불리는 Static한 형태의 Polymorphism을 제공한다. 즉, 오른쪽의 Generic한 함수는 왼쪽의 함수 형태보다 Static한 형태의 Polymorphism을 제공한다. Static한 형태의 Polymorph..
[WWDC] Understanding Swift Performance(2) - Protocol Programming
2023. 8. 7. 17:48
iOS/Swift
앞선 포스팅에서 Polymorphic(다형성)을 사용하기 위해선, Class를 사용해야 했다. 하지만, Class는 아래와 같은 이유로 성능적으로 좋지 않았다. Heap Memory Allocation, Reference Counting, Dynamic Dispatch 그렇다면 Struct로 "Polymorphic(다형성)"을 사용할 수 없을까? 이는 Protocol Oriented Programming을 통해 가능하다. Dynamic Dispatch without V-Table Class의 경우 Common Inheritance Relationship(공통 상속관계)가 존재하기 때문에 V-Table이 필요했다. 하지만 Struct의 경우 Class와 달리 Common Inheritance Relatio..
[WWDC] Understanding Swift Performance(1) - Dimensions of Performance
2023. 8. 6. 18:17
iOS/Swift
Swift에서 "Abstration(추상화) 메커니즘이 성능에 미치는 영향"을 이해하기 위해 가장 좋은 방법은 기본 구현을 이해하는 것이다. Abstration 메커니즘을 설계하고, 선택할 때 다음과 같이 3가지를 고려해야 한다. Allocation Reference Counting Method Dispatch 이 3가지 요소들을 하나하나 살펴보도록 하자. Allocation (Stack vs. Heap) Swift는 자동으로 메모리를 할당하고, 해제한다. 이 중 일부는 Stack에 저장하기도 Heap영역에 저장한다. Stack "Stack"은 LIFO구조로 Static하게 메모리를 할당할 수 있는 매우 단순한 Data Structure이다. Top에서만 데이터의 삽입(Push)과 삭제(Pop)가 가능하..
[RxSwift] Single With Share Operator
2023. 7. 26. 00:41
iOS/RxSwift
Signle은 RxSwift의 Traits로 하나의 이벤트만 방출하는 Observable이다. Single에는 failure, success라는 2가지 이벤트가 존재한다. success는 일반 Observable의 next + completed와 같은 역할이고 failure은 error이벤트와 같은 역할이다. 다음과 같이 초기에 한번만 이루어지는 네트워크 요청에 자주 사용된다. static func featchAllData(_ url: String) -> Single { return Single.create { single in URLSession.shared.dataTask(with: URL(string: url)!) { data, res, err in if let err = err { single(...
[RxSwift] Relay vs. Signal vs. Driver
2023. 7. 25. 22:41
iOS/RxSwift
RxSwift를 사용해서 UI작업을 할 때 RxCocoa에 존재하는 Relay, Signal, Driver를 많이 사용하곤 한다. 이 3개의 차이점에 대해서 알아보자. Relay Relay는 Subject의 Wrapper Class이다. 이는 completed, error이벤트를 무시하며, next이벤트만 Subscriber에게 전달한다. UI Update를 위해 사용하는 Subject가 error 혹은 completed이벤트로 스트림이 끊기면 안 되기 때문에, Relay는 UI작업에 특화된 Subject이다. 더 자세한 내용은 해당 포스팅에 있으니 참고 바란다. Driver & Signal Driver와 Signal은 RxCocoa의 Trait로 Main Thread에서 동작하는 것을 보장하며, err..
[RxSwift] Operator(4) - Share
2023. 7. 24. 22:54
iOS/RxSwift
Observable은 구독되기 전까지는 동작하지 않다가, 구독이 이루어지면 한 번에 데이터를 방출한다. 이걸 Cold Observable이라 한다. Cold Observable은 UnitCast방식으로 동작하여, Subscriber마다 하나의 Stream이 생성이 된다. 반면 Subject와 같은 Hot Observable은 Multicast방식으로 동작하며, 하나의 Stream을 통해 데이터가 방출된다. 이 내용이 이해되지 않는 다면, 해당 포스팅을 보길 바란다. 하나의 Stream을 통해 데이터가 방출되는 Hot Observable과 달리 Subscriber마다 Stream이 생성되는 Cold Observable에서는 Stream이 여러개 생길 수 있다. 다음과 같은 함수가 있다고 가정해 보자. fu..
[iOS] Infinite Carousel
2023. 7. 23. 16:00
iOS/iOS
이번 포스팅에선 아래와 같이 무한히 스크롤되는 Infinite Carousel을 구현해보자. 전체 코드는 여기에서 확인해볼 수 있다. Collection View 우선 CollectionView를 생성해보자. private let collectionView: UICollectionView = { let layout = UICollectionViewFlowLayout() layout.scrollDirection = .horizontal // 스크롤 방향 설정 /// CollectionView를 생성할 때 layout을 Initialized해주어야 한다. let collectionView = UICollectionView( frame: .zero, collectionViewLayout: layout ) co..