[iOS/Swift] Realm - Migration
·
iOS/🔎 swift 정리하기
💡 Migration 컬럼 명을 변경하였기 때문에 일치하지 않는다는 런타임 오류가 발생한다. ✅ 스키마 버전 체크 func checkSchemaVersion() { do { let version = try schemaVersionAtURL(realm.configuration.fileURL!) print("schema version: \(version)") } catch { print(error) } } db 테이블 스키마에 대한 버전을 관리하기 위해 migration 작업을 해야한다. realm의 default schema 버전은 0 migration 작업은 appDelegate에서 작업해야 한다. func application(_ application: UIApplication, didFinishLau..
[iOS/Swift] Realm - 이미지 파일 저장하기
·
iOS/🔎 swift 정리하기
서버 통신 한 이미지 파일 저장하고 불러오기 서버 통신을 통해 받은 이미지 url을 데이터 베이스에 저장한 후 꺼내와서 이미지를 로드하면 오류가 발생한다. 데이터 베이스 내부에서 꺼내온 값을 글로벌로 접근하려고 하기 때문에 발생한 오류이다. DispatchQueue 외부에서 상수로 저장한 후 사용하면 오류가 나지 않는다. 이미지를 하나하나 불러올 때 마다 네트워크 통신을 하게 되는데, 이미지의 용량이 크거나 로드할 데이터가 많다면 이미지 로드가 오래 걸릴 수 있다. ❓ 어떻게 해결해야 할까? 이미지 구현을 셀 구성할 때 하지말고, 미리 UIImage 형식으로 변환 후 셀에 보여주는 것. 하지만 이 또한 데이터가 여러개라면 변환하는 데에 오랜 시간이 걸리고, 사용자가 보지 않고 넘겨버릴 이미지까지 모두 로..
[iOS/Swift] Realm - CRUD
·
iOS/🔎 swift 정리하기
💡 swift에서 Realm 사용해보기 ✅ Realm Model 만들기 @Persisted 앱을 종료하더라도 유지되어야 하는 데이터를 지정하기 위해 사용 ✅ PK 지정하기 @Persisted(primaryKey: true) var id = 0 PK값을 별도로 지정할 수도 있고, 자동으로 key값을 지정하도록 할 수 있다. 💡 CRUD import RealmSwift let realm = try! Realm() realm 파일에 접근하는 상수를 선언한다. realm 파일의 위치를 찾는 코드 도큐먼트 폴더 내 default.realm 🔎 Create let realm = try! Realm() let specificPerson = realm.object(ofType: Person.self, forPrimar..
[iOS/Swift] Modal Style과 LifeCycle
·
iOS/🚨 오류 그리고 해결
컬렉션 뷰의 셀을 선택한 후 좋아요 버튼 해제 시 DB에서 삭제되어 변경된 데이터가 컬렉션 뷰에 업데이트 되도록 구현하고 있었다. 버튼 클릭 후 데이터가 삭제후 dismiss를 수행하도록 구현하였다. 뷰가 다시 나타나려면 viewWillAppear()가 호출 될 것이고, 뷰가 갱신되어 깔끔하게 정리 될 컬렉션 뷰를 기대하였다.. 삭제 쿼리가 정상 작동하는 것은 확인했는데 대체 왜 바로 reload가 수행되지 않을까? 결국 sos 요청 후 굉장한 깨달음을 얻게 되었다ㅠㅠ viewWillAppear()에서 데이터가 잘 변경되었는지 확인해보려 출력시켜보니 viewWillAppear()가 호출되지 않고있었다. 그렇다면 뷰가 사라지긴 한건가? viewDidDisappear()도 호출해보자 애초에 컬렉션 뷰가 사라..
[iOS/Swift] - Swift에서 값을 전달하는 방법
·
iOS/🔎 swift 정리하기
💡 Pass Data between View Controllers property notification delegate pattern closure 🔎 property 데이터를 넘길 뷰의 프로퍼티에 직접 값을 전달하는 방식이다. push나 present 방식의 화면 전환에서만 사용할 수 있다. ❗️ 전환된 화면에서 다시 돌아갈 때 값을 전달하고 싶다면 다시 돌아갈 뷰컨에 전달해야 하는데 잘 사용하지도 않으며 뷰컨 관계가 상호적으로 묶이게 되는 문제가 발생한다. 때문에 역방향으로 값을 전달하고 싶을 땐 다음 세가지 방법을 사용해보자 🔎 Notification A → B → C ⇒ C에서 변경한 데이터 A, B에 반영 post → signal ( signal name) “Name”이라는 signal을 ad..
23.09.01 금
·
iOS/🌱 SeSAC
화면 전환 시 서버 통신 화면 전환 시 서버 통신 후 값 전달화면 전환할 때 응답을 받은 후 전환해야 하기 때문에 사용자 입장에서 불편함을 느낄 수 있음(속도) 통신에 실패할 시 얼럿 등의 메세지를 띄우는 대처 필요 화면 전환 후 viewDidLoad 통신 실패 화면을 준비하는 것이 필요하다 💡 URL Session 타임아웃 시간 걸기 let request = URLRequest(url: url!, timeoutInterval: 10) error가 발생하지 않는다면 error 값은 nil일 것이다. let result = try? JSONDecoder().decode(, from: data) 오류가 발생했을 때 result에 nil값이 들어가버리면 어디에서 문제가 발생했는지 알 수 없다. let resu..
23.08.31 목
·
iOS/🌱 SeSAC
✅ deinit 메모리 상에서 뷰컨이 필요 없어져서 메모리 상에서 사라졌는지 확인할 때 사용 deinit { print("deinit", self) } 메모리 누수를 찾아볼 수 있는 방법이다. back button 클릭하여 뷰가 사라질 때 deinit 호출 됨 viewcontroller에 작성했던 collection view의 설정들을 view 파일에서 작성하기 🚨view에서 화면 전환이 불가능 화면 전환 관련 코드들은 viewController가 가지고 있기 때문에 view에서 작성 시 didSelectItem에서 화면 전환을 구현할 수 없다. 값 전달 활용 - protocol protocol을 활용하여 셀을 선택 함을 알려줌 1. protocol 생성 2. delegate 생성 3. 셀 선택 시 vi..
23.08.30 수
·
iOS/🌱 SeSAC
💡 싱글톤 패턴 클래스는 어디서든 인스턴스 생성을 할 수 있다 init이 internal로 선언되어 있기 때문 아무 곳에서나 생성이 되지 않게 하기 위해 private으로 접근 제어 수준을 높이자 💡 convenience init searchBar, button 등은 왜 초기화 할 때 frame 지정을 안해줘도 동작이 될까? 초기화 구문을 구현할 때 convenience를 붙인다면 디폴트 값을 지정해줄 수 있다. 초기화 시 매개변수를 안보이게 내부적으로 디폴트 값이 구현되어 있고, 초기화 시 디폴트 값으로 초기화를 한다. 💡 webView 웹 뷰에서 네비게이션 컨트롤러가 처음에는 투명, 스크롤 하면 불투명 ✅ NavigationBar Custom 스크롤x / 스크롤 내렸을 때 navigationContr..
23.08.29 화
·
iOS/🌱 SeSAC
💡 addObserver 중복 ) addObserver는 한 번만 등록되도록 배치해야 한다. viewWillAppear에 등록한다면 Observer 호출 횟수가 계속해서 증가한다. 중복 노티 방지를 체크해야 함! ✅ removeObserver ✅ Notification Extension 💡datePicker ✅ dataPickerView 코드 베이스 구성하기 💡Protocol Delegate 값 전달 protocol 구현 2. delegate 3. 전달할 값 매개변수로 넣기 4. 전달 받은 값 5. 화면 전환 시 값 전달 ✅ DateFormat Extension 💡 Access Control ✔️ open > public > internal > fileprivate > private 코드에 대한 접근을 ..
23.08.28 월
·
iOS/🌱 SeSAC
💡 레이아웃 코드 분리하기 BaseViewController BaseViewController를 생성하여 VC에 공통적으로 사용하는 설정 요소들을 작성하고 뷰 컨트롤러들이 상속 받는 형식으로 구성 뷰 객체에 대한 UI나 레이아웃, 토스트 메세지, 얼럿, 임포트 등 뷰컨에서 공통적으로 작성되는 코드를 구조화 함으로써 가독성도 높이고 코드 중복도 줄일 수 있다. ✅ view controller의 레이아웃 코드 분리하기 BaseView를 상속받는 AddView → AddViewController의 루트 뷰로 설정할 것 자기 자신에게 적용하는 것이기 때문에 view는 지워도 된다. AddView 클래스 인스턴스를 생성 mainView를 루트 뷰로 교체를 해줘야 한다. 💡 RootView - loadView() ..