본문 바로가기

전체 글54

[Swift] Observable(UniCast) vs Subject(MultiCast) { Bind vs Drive } RxSwift를 공부하다 보면 Observable과 Subject가 나오는데 둘의 차이점이 무엇일까요?같은 Observable을 여러 Observer에서 구독했는데 어떤 경우에는 같은 값이 오고 어떤 경우에는 다른 값이 오는 이유는 무엇일까요?Subscribe와 Bind와 Drive의 차이는 무엇일까요? 오늘은 이 궁금증에 대해서 알아보도록 하겠습니다.Observable(UniCast)Observable은 RxSwift에서 사용되는 개념으로, 단일 값을 방출하는 일련의 이벤트 스트림입니다. Observable은 이벤트를 생성하고, 이벤트를 구독하는 Observer들에게 이벤트를 전달합니다. Observable은 하나의 Observer에게만 이벤트를 전달하는 UniCast 방식입니다. 예를들어 아래와 같은.. 2023. 11. 7.
[Swift] Queue 구현해보기 Swift에서는 Queue에 대해서 지원을 하지 않습니다.때문에 사용자가 직접 구현해줘야 하는데요.Queue를 알기 전에 간단하게 Stack에서 알아보겠습니다.Stack이란 무엇인가요?Stack은 LIFO(Last In First Out) 방식으로 동작하는 자료구조입니다. 예를 들어 편의점 냉장고에 음료를 채울 때, 앞에서부터 채우면 나중에 채운 음료가 먼저 나가고 처음 넣은 음료가 가장 마지막에 나가게 됩니다. Swift에서는 주로 Array를 사용하여 Stack을 대체해 사용할 수 있습니다.Array에 데이터를 append할 때, 데이터는 배열의 뒤에 쌓이게 됩니다. Array에서는 popLast() 또는 removeLast() 메서드를 사용하여 가장 마지막에 추가된 데이터를 제거할 수 있습니다. Q.. 2023. 11. 5.
[Swift] NavigationBar의 Title높이가 이상할때 원인 요약네비게이션 타이틀의 위치 문제가 발생했습니다.이 문제의 원인은 네비게이션 컨트롤러가 중첩되어 있었기 때문입니다.SceneDelegate에서 TabBarController를 NavigationController 안에 중첩했으며,TabBarController에서 FirstVC를 생성할 때도 NavigationController에 중첩되었습니다.이 문제를 해결하기 위해 나는 SceneDelegate에서 NavigationController를 제거하여 문제를 해결했습니다. 문제아래 (좌측) 뷰 컨트롤러의 Title이 살짝 아래로 내려가 있는 것을 확인할 수 있습니다.원래는 (우측) 뷰 컨트롤러처럼 Title이 상단에 가까워야 합니다.문제의 뷰컨트롤러 정상적인 뷰컨트롤러뷰 계층이상해서 뷰의 계층을 살펴봤습니다.. 2023. 10. 2.
[Swift] Realm 파일을 프로젝트 내부에 삽입하는 방법 및 사용하기 (파일 접근 에러) 요약실제 기기에서는 번들에 있는 Realm 파일에 접근할 수 없어서 파일 접근 에러가 발생합니다. 이를 해결하기 위해 앱이 실행 중일 때 Realm 파일을 앱의 documentDirectory로 복사하여 사용하는 방법을 사용할 수 있습니다. 이렇게 하면 파일에 대한 읽기 및 쓰기 권한이 부여되어 Realm 데이터베이스를 사용할 수 있습니다. 문제의 시작운동 기록 앱을 개발할 때, 운동 데이터베이스(DB)를 생성하여 앱에 삽입하여 사용하려고 시도해 보았습니다. Realm 파일을 만들어 프로젝트에 포함시킨 후 Bundle에 넣어 사용하면 되지 않을까 생각하여,Realm 파일을 Bundle에 넣었습니다. Bundle에 있는 파일을 사용하기 위해서는 다음과 같이 진행해야 합니다: App Targets → Bui.. 2023. 10. 1.
[Swift] UITabBarAppearance의 배경색은 어떤 차이가 있을까? UITabBarAppearance TabBar를 코드베이스로 구현하면서 궁금증이 생겼습니다. 탭바의 배경색은 어떻게 설정할 수 있고, 아래 세 가지 메서드의 차이는 무엇일까요? 세 가지 메서드를 비교해보면서 적용해보았지만, 비슷한 것 같으면서도 다른 것 같아서 한 번 분석해보았습니다. iOS 13.0+ configureWithDefaultBackground let appearance = UITabBarAppearance() appearance.backgroundColor = UIColor.systemYellow appearance.configureWithDefaultBackground() tabBar.standardAppearance = appearance print("backgroundColor: ",.. 2023. 9. 3.
[swift] SF Symbol & UIImage.SymbolConfiguration에 대해서 알아보자 UIImage(SystemName:) 지금까지는 간단하게 UIImage(systemName: "person.3.sequence.fill") 와 같은 방식으로 이미지를 만들어 왔지만, 렌더링 색상과 Configuration을 적용할 생각을 하지 않았는데요. 오늘은 시스템 이미지를 커스터마이징하여 사용하는 방법에 대해 살펴보겠습니다. SFSymbols SFSymbols는 애플에서 기본으로 제공하는 시스템 이미지입니다. XCode에서는 UIImage(systemName:)을 사용하여 호출할 수 있습니다. 이미지를 선택할 때 SFSymbols 내에 다양한 렌더링 종류와 종류에 따른 색상이 제공됩니다. 렌더링 색상으로는 단색(Monochrome), 계층(HierarchicalColor), 팔레트(PaletteCo.. 2023. 9. 3.
[Swift] weak 키워드와 Strong Reference Cycle delegate패턴과 메모리 누수이번 글의 내용은 프로토콜을 사용할 때 weak 키워드를 제대로 사용하지 않아메모리 누수가 발생하는 문제를 해결하는 방법에 대한 내용입니다.델리게이트 패턴 사용델리게이트 패턴을 사용하면 뷰컨트롤러에서 뷰에게 동작을 위임할 수 있습니다. 컬렉션뷰를 뷰컨트롤러가 아닌 뷰에 만들고 컨트롤도 위임할 수 있습니다.이를 위해서는 delegate = self와 같이 델리게이트를 설정해줘야 합니다.HomeViewfinal class HomeView: BaseView { // HomeViewController를 델리게이트로 위임 var delegate: HomeViewProtocol? lazy var collectionView: UICollectionView = {...}() ... } .. 2023. 8. 31.
[Swift] 비동기 호출 CallBack지옥과 DispatchGroup 서버에서 가져온 데이터를 화면에 표시 영화 데이터를 서버에서 요청하여 받아오는 작업을 할 때, 한 화면에서 여러 개의 데이터를 요청해야 하는 경우가 있습니다. 예를 들어, 해리포터와 관련된 영화 목록이나 트랜스포머와 관련된 영화 목록과 같은 영화 목록 데이터를 여러 개 받아오는 경우가 있습니다. 서버에서 받아온 데이터를 화면에 보여줄 때, CollectionView나 TableView를 통해 보여주게 됩니다. 이때, 언제 reloadData() 메서드를 호출해 뷰를 갱신시켜줄지에 대해 고민하게 됩니다. 예시 화면과 코드 var movieInfo1: [MovieResult] = [] var movieInfo2: [MovieResult] = [] var movieInfo3: [MovieResult] = [].. 2023. 8. 19.