[iOS/Swift] MapKit - 원하는 곳에 어노테이션을 찍어보자
·
iOS/UIKit&SwiftUI
맵뷰에서 선택하는 곳에 어노테이션을 찍어보자  1. 맵뷰에 탭 제스쳐를 추가한다.let tapGesture = UITapGestureRecognizer(target: self, action: #selector(mapViewTapped(_ :)))mapView.addGestureRecognizer(tapGesture) 2. sender.location(in: )을 통해 임의로 탭한 위치를 가져온다.@objc private func mapViewTapped(_ sender: UITapGestureRecognizer) { let location: CGPoint = sender.location(in: mainView.mapView) let mapPoint: CLLocationCoordinate2D =..
[iOS/Swift] MapKit - 위치 권한 설정을 구현해보자!
·
iOS/UIKit&SwiftUI
위치 권한 진행 방법을 결정 하려면 권한 부여 상태와 정확도 값을 모두 확인해야 한다.위치서비스o 권한 요청권한 허용사용자 정보 접근 가능추후 거부 (설정 → 옵션 끄기)ios 시스템 설정 유도권한 거부ios 시스템 설정 유도x 권한 없음alert → ios 시스템 설정 유도 CoreLocation importimport CoreLocation 위치 매니저 인스턴스 생성private let locationManager = CLLocationManager() delegate 연결locationManager.delegate = self 프로토콜 연결해주기extension MainMapViewController: CLLocationManagerDelegate { // 사용자의 위치를 성공적..
[iOS/Swift] Realm - 백업 및 복구 구현하기
·
iOS/UIKit&SwiftUI
💡 백업 / 복구개인 앱의 경우 개개인에게 백업 복구의 책임을 넘긴다.개발자 → 기능만 제공, 백업 알아서,,구글 드라이브, 드랍박스로 백업하기→ 써드파티 프로그램의 정책으로 유지보수 비용이 높다아이폰 파일 앱 사용하여 백업 복구하도록 하기 1. realm 파일 자체를 압축마이그레이션 대응이 잘 되어야 한다.사용자가 백업해두고 한참 뒤에 복구할 수 있기 때문realm 파일을 복구할 때는 복구 완료 후 앱을 껐다 켜야 함 2. json으로 압축하기다른 sql을 쓰더라도 대응하기 좋음🔎 realm 파일 압축하기백업하고자 하는 파일들의 경로 배열 생성var urlPaths = [URL]() 도큐먼트 위치guard let path = documentDirectoryPath() else { print("..
[iOS/Swift] Realm - Migration
·
iOS/UIKit&SwiftUI
💡 Migration컬럼 명을 변경하였기 때문에 일치하지 않는다는 런타임 오류가 발생한다.✅ 스키마 버전 체크func checkSchemaVersion() { do { let version = try schemaVersionAtURL(realm.configuration.fileURL!) print("schema version: \(version)") } catch { print(error) }} db 테이블 스키마에 대한 버전을 관리하기 위해 migration 작업을 해야한다.realm의 default schema 버전은 0migration 작업은 appDelegate에서 작업해야 한다. func application(_ application: UIApplication, didFi..
[iOS/Swift] Realm - 이미지 파일 저장하기
·
iOS/UIKit&SwiftUI
서버 통신 한 이미지 파일 저장하고 불러오기서버 통신을 통해 받은 이미지 url을 데이터 베이스에 저장한 후 꺼내와서 이미지를 로드하면 오류가 발생한다.데이터 베이스 내부에서 꺼내온 값을 글로벌로 접근하려고 하기 때문에 발생한 오류이다. DispatchQueue 외부에서 상수로 저장한 후 사용하면 오류가 나지 않는다.이미지를 하나하나 불러올 때 마다 네트워크 통신을 하게 되는데, 이미지의 용량이 크거나 로드할 데이터가 많다면 이미지 로드가 오래 걸릴 수 있다. ❓ 어떻게 해결해야 할까?이미지 구현을 셀 구성할 때 하지말고, 미리 UIImage 형식으로 변환 후 셀에 보여주는 것.하지만 이 또한 데이터가 여러개라면 변환하는 데에 오랜 시간이 걸리고,사용자가 보지 않고 넘겨버릴 이미지까지 모두 로드를 해야하..
[iOS/Swift] Realm - CRUD
·
iOS/UIKit&SwiftUI
💡 swift에서 Realm 사용해보기✅ Realm Model 만들기 @Persisted앱을 종료하더라도 유지되어야 하는 데이터를 지정하기 위해 사용✅ PK 지정하기@Persisted(primaryKey: true) var id = 0  PK값을 별도로 지정할 수도 있고, 자동으로 key값을 지정하도록 할 수 있다.💡 CRUDimport RealmSwiftlet realm = try! Realm()realm 파일에 접근하는 상수를 선언한다.realm 파일의 위치를 찾는 코드도큐먼트 폴더 내 default.realm🔎 Createlet realm = try! Realm()let specificPerson = realm.object(ofType: Person.self, forPrimaryKey: 123..
[iOS/Swift] Modal Style과 LifeCycle
·
Study/🚨 TroubleShooting
컬렉션 뷰의 셀을 선택한 후 좋아요 버튼 해제 시 DB에서 삭제되어 변경된 데이터가 컬렉션 뷰에 업데이트 되도록 구현하고 있었다. 버튼 클릭 후 데이터가 삭제후 dismiss를 수행하도록 구현하였다. 뷰가 다시 나타나려면 viewWillAppear()가 호출 될 것이고, 뷰가 갱신되어 깔끔하게 정리 될 컬렉션 뷰를 기대하였다.. 삭제 쿼리가 정상 작동하는 것은 확인했는데 대체 왜 바로 reload가 수행되지 않을까? 결국 sos 요청 후 굉장한 깨달음을 얻게 되었다ㅠㅠ viewWillAppear()에서 데이터가 잘 변경되었는지 확인해보려 출력시켜보니 viewWillAppear()가 호출되지 않고있었다. 그렇다면 뷰가 사라지긴 한건가? viewDidDisappear()도 호출해보자 애초에 컬렉션 뷰가 사라..
23.09.01 금
·
Study/🌱 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 목
·
Study/🌱 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 수
·
Study/🌱 SeSAC
💡 싱글톤 패턴 클래스는 어디서든 인스턴스 생성을 할 수 있다 init이 internal로 선언되어 있기 때문 아무 곳에서나 생성이 되지 않게 하기 위해 private으로 접근 제어 수준을 높이자 💡 convenience init searchBar, button 등은 왜 초기화 할 때 frame 지정을 안해줘도 동작이 될까? 초기화 구문을 구현할 때 convenience를 붙인다면 디폴트 값을 지정해줄 수 있다. 초기화 시 매개변수를 안보이게 내부적으로 디폴트 값이 구현되어 있고, 초기화 시 디폴트 값으로 초기화를 한다. 💡 webView 웹 뷰에서 네비게이션 컨트롤러가 처음에는 투명, 스크롤 하면 불투명 ✅ NavigationBar Custom 스크롤x / 스크롤 내렸을 때 navigationContr..