일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- contentInset
- mvvm
- SWIFTUI
- Info.plist
- delegation
- 아이폰
- Navigation
- SWIFT
- UIResponder
- View Life Cycle
- 독서후기
- Failed to register bundle identifier
- NumberFormatter
- Modality
- 독후감
- roundingMode
- 스타트업주니어로살아남기
- 야곰아카데미
- IOS
- NotificationCenter
- viewcontroller
- 부트캠프
- xcode
- Mock
- Codegen
- 책후기
- human interface guidelines
- 스위프트
- @available
- Structures and Classes
- Today
- Total
목록Software Engineering/iOS (76)
호댕의 iOS 개발

기존 프로젝트를 다시 MVVM + RxSwift로 리팩토링하면서 다시 Networking 작업을 하고 있다. 저번에는 네트워크와 관련된 테스트 코드를 짜지 못했었는데 이번에는 Stub을 이용해 네트워크에 연결되지 않는 상황에서 테스트를 할 수 있도록 구현했다. (일단 여기선 RxSwift만을 사용하고 기타 Moya나 Alamofire같은 네트워킹 관련 라이브러리는 사용하지 않았습니다) 여기서 사용하는 Stub은 테스트 더블이라 볼 수 있다. 즉, 테스트를 직접 진행하기 어려운 경우, 이를 대신해 테스트를 진행할 수 있는 객체를 따로 생성하는 것이다. 🤔 테스트 더블을 사용한 테스트 이유 그럼 네트워크 관련 테스트에서 Stub을 사용하는 이유는 뭘까? 네트워크를 사용할 때보다 테스트 속도가 빠르다 네트워크..

CoreData의 공식 문서를 살펴보면 CoreData에 대해 이렇게 정의를 하고 있다. Persist or cache data on a single device, or sync data to multiple devices with CloudKit. Data를 단일 기기에 저장하거나 데이터를 캐시하거나, CloudKit을 사용하여 다양한 기기에서 동기화를 할 때 사용되는 프레임워크이다. 즉, 단순히 local 데이터를 저장하는 데이터베이스 역할을 하는 것이 아니라 저장, 캐시, 동기화 등의 기능을 제공하는 프레임워크인 것이다. 이외에도 Undo / Redo Manager를 통해 변화를 감지하여 쉽게 Undo와 Redo를 구현할 수 있도록 하기도 한다. 물론 Local에 저장을 할 때 즉, 온라인 / 오프..

🤔 문제상황 1️⃣ Info.plist Info.plist를 따로 폴더를 두려고 관리하기 위해 폴더 내부에 해당 파일을 넣어놨으나, Failed to register bundle identifier 컴파일 에러가 발생하는 문제가 있었다. 다른 부분은 변한 것이 없었고, 단순히 파일의 위치를 변경하기만 했기 때문에 이 때문에 발생한 에러라고 판단했다. 2️⃣ GoogleService-Info Firebase를 사용하면서 추가해야 하는 파일인데 이 또한 위치를 변경하려다 보니 문제가 발생했다. `FirebaseApp.configure()` could not find a valid GoogleService-Info.plist in your project. 🤓 해결 방법 1️⃣ Info.plist Targets..

🔔 야곰아카데미 토요 스터디에서 진행한 내용입니다. 최근 앱을 사용하다보면 Google / Naver / Kakao / Facebook을 통한 소셜 로그인 기능을 자주 볼 수 있다. 이런 소셜 로그인이 어떻게 구현되는지 간단하게 살펴보고 직접 카카오를 통한 소셜 로그인 기능을 구현해보자. 일단 직접 구현하는 방법을 살펴보기 전에 OAuth가 어떤 기능인지 살펴보자. 🪢 OAuth 📚 정의 사용자(개발자 및 회사)들이 제 3사의 서비스를 사용하기 위해 사용하는 개념으로 위임 / 인가 / 허가 프로토콜이다. 이는 단순한 인증 프로토콜이 아니기 때문에 단순히 `소셜 로그인 = OAuth`라고 보기에는 무리가 있다. 다만 누군가에게 허가 / 위임 / 인가를 하기 위해선 본인을 증명해야 다른 사람에게 본인의 권한..

어제 직접 실기기를 연결해서 테스트를 하려 했으나 아래와 같은 에러가 발생했다. (캡쳐 이미지에서 보이는 화면은 Xcode에서 cmd + shift + 2를 눌러 나온 화면입니다) Unable to prepare iPad for development !! 아니 분명 잘 되던게 왜 안되는거지.... 그래서 혹시 몰라 아이폰으로도 테스트를 해보았다. 그러자 자꾸 아래와 같은 상황이 발생했다. iPhone is busy: Making ~Apple Watch ready for development 아니 왜 하는 것도 없는데 자꾸 바쁘다고 하는거냐고!!! 후... 😱 Apple Watch에 연동이 되어 있어 계속 Apple Watch에게 승인을 받는다고 하여 일단 블루투스를 끄고 시도를 해봤다. 그랬더니 이런 에..

Delegation 패턴은 delgate란 단어에서 볼 수 있듯 특정 Action을 다른 객체가 하도록 위임 하는 것이다. 즉, 특정 Action에 대한 위임을 받은 객체가 대신 일을 처리해주는 것이다. 이는 iOS에서 TableView를 활용하다보면 UITableViewDelegate, UITableViewDataSource라는 프로토콜을 볼 수 있는데, 이 또한 Delegation 패턴을 사용하고 있는 것이다. 애플이 구현해놓은 TableView를 사용할 때 이를 어떻게 구성할 지는 개발자가 정하게 된다. 따라서, TableView가 UITableViewDelegate, UITableViewDataSource라는 프로토콜을 채택한 ViewController에게 테이블 뷰의 Section과 Row는 어..

만약 다른 사람들이 특정 코드를 사용하지 못하도록 하려면 어떻게 처리를 해줘야 할까? 예를 들어 이런 코드가 있다고 생각을 해보자. required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } 해당 코드는 스토리보드에서 ViewController를 생성할 때 호출되는 생성자이다. 만약 따로 생성자를 정의하면서 required init?을 불가피하게 생성을 했다고 가정한다면 required init?은 다른 곳에선 사용을 하지 못하게 해야 한다. required init을 통해 VC를 생성하지 않고 따로 정의한 생성자로 VC를 생성해야 하기 때문이다. 이때는 available attribute를 사용하면 된다. ..

최근 프로젝트를 진행하며 RxSwift, RxCocoa를 사용하게 됐다. 또한 기존 MVC 패턴을 사용해 주로 개발을 진행했지만 MVVM 디자인 패턴을 새롭게 사용해봤다. 물론 아직은 부족한 점이 많지만 그래도 프로젝트를 진행하면서 알게 된 MVVM은 무엇이고 어떻게 적용을 할 수 있는지 정리해보고자 한다. 🔸 그 전에 MVC 패턴부터... 일단 기존에 사용하던 MVC 패턴의 경우 Model, View, Controller로 나뉘게 된다. 애플에서도 CocoaMVC를 기본적으로 사용했다. View : 사용자가 직접 볼 수 있는 객체로, 스스로 어떻게 그려지는지를 알고 있으며, 사용자의 Action에 응답할 수 있다. ViewController : 하나 이상의 View와 하나 이상의 Model을 중재하는 ..