본문 바로가기

🍎 iOS122

[RxSwift] UITextField로 검색하기(debounce, distinctUntilchnaged, share) debounce debounce는 사용자가 지정한 시간 (timespane) 내에 방출되는 값에서 가장 마지막 값을 방출함 이벤트가 방출하고 나면 timespane은 초기화 됨 주로 사용자가 검색필드에서 검색어를 입력할 때마다 그 결과값을 보여주기 보다는 debounce로 timespane 내에 마지막 입력에 대해 결과값을 보여줄 수 있음 distinctUntilchanged 중복된 값이 입력되면 해당 값을 무시함 사용자가 텍스트를 빠르게 입력한 경우 가장 처음에 입력된 텍스트만 방출됨 UITextField의 경우 .allEditingEvents에 의해 입력 시작, 입력된 값의 수정, 입력 끝일 때 값을 방출하게 됨. distinctUntilChnaged 를 사용하게 되면 입력된 값의 변화가 일어나야 방.. 2022. 10. 10.
[RxSwift] Traits의 Single과 Service for Network 보호되어 있는 글 입니다. 2022. 10. 9.
[RxSwift] Input Output ViewModel with MVVMC 보호되어 있는 글 입니다. 2022. 10. 9.
[RealmSwift] Migration, 운영 중인 앱의 필드 추가한 후 마이그레이션 해주기 class Customer: Object { @objc dynamic var idx = 0 @objc private dynamic var privateType: Int = CustomerType.active.rawValue let products = List() } 이미 운영 중인 앱에(혹은 코드를 작성 중) 3개의 프로퍼티가 있음. 이미 realm을 이용해서 객체를 생성해 realm 데이터베이스에 add 해준 후 나중에 다른 프로퍼티를 생성하려 하면 오류가 발생 Realm Studio를 사용해서 조회해 보면 이미 3개의 프로퍼티에 대한 값만 지정되어 있음 class Customer: Object { @objc dynamic var idx = 0 @objc dynamic var name = "무명" @o.. 2022. 10. 2.
[RealmSwift] 객체 조회하기 모든 객체 조회 모든 객체를 조회하고 싶은 경우 objects 메소드를 사용할 수 있음 let allProduct = realm.objects(Product.self) PrimaryKey를 이용한 조회 primary key의 경우 int와 String 모두 가능하지만 고유의 가질 수 있는 String을 사용할 것을 권장함 let customer = realm.object(ofType: Customer.self, forPrimaryKey: 1) 이때 primaryKey 조건에 해당하는 객체가 있을 수도 있고 없을 수도 있으므로 리턴되는 객체는 옵셔널 NSPredicate 쿼리 생성 cheetsheet : https://academy.realm.io/posts/nspredicate-cheatsheet/ le.. 2022. 10. 2.
[RealmSwift] LinkingObjects와 Realm Studio 관계형 데이터베이스에서 테이블과 테이블간의 관계를 만들어 줄 수 있음 LinkingObjects를 사용하면 1:n, 1:1 관계를 만들어 줄 수 있음 class Customer: Object { @objc dynamic var idx = 0 let products = List() } Object를 상속받는 모델 클래스에서 프로퍼티를 생성해 줌 array 타입으로서 Customer은 여러개의 Product를 가짐 Customer 객체에는 Product에 대한 참조가 생김 class Product: Object { @objc dynamic var name = "" @objc dynamic var price = 0 let ofCustomer = LinkingObjects(fromType: Customer.se.. 2022. 10. 2.
[RealmSwift] primaryKey와 AutoIncrease PrimaryKey class Customer: Object { @objc dynamic var idx = 0 } primaryKey로 사용할 프로퍼티를 정의해줌 override class func primaryKey() -> String? { return "idx" } primaryKey를 오버라이드하여 쉽게 primaryKey 를 지정할 수 있음 리턴값이 String이므로 프로퍼티 명을 스트링으로 리턴해줌 AutoIncrease primaryKey로 지정했다고 자동으로 값을 증가시키면서 고유값을 가지게 하는 기능은 없음 realm은 사용자 지정 함수와 프로퍼티 사용이 가능하기 때문에 새로운 데이터가 생길때마다 값을 증가시키는 함수를 작성해 줄 수 있음 참고 사이트 : https://stackoverf.. 2022. 10. 2.
[RealmSwift] 데이터 모델에 enum으로 타입 지정하기 필드 값의 지정된 타입이 있거나 등급이 있는 경우 등에 enum의 장점을 이용할 수 있음 enum을 사용하게 되면 정해진 입력값 내에서 입력하게 되므로 예상치 못한 오류가 생기지 않음 값을 입력할 때 String이나 Int를 사용하지 않고 정해진 타입을 입력하므로 좀더 직관적임 enum CustomerType: Int { /// 활동 계정, default case active /// 휴면 계정 case dormant /// 정지 계정 case suspension } CustomerType enum을 정의해 줌 (enum에서 각 case의 값을 지정해 주지 않는다면 정의해준 순서대로 0, 1, 2.. 가 됩니다. 만약 가장 처음 정의된 case에 71을 지정해 주었다면 71, 72, 73... 순으로 값을.. 2022. 10. 2.
[iOS/Swift] WKWebView에서 Scheme과 Query로 web과 communication하기 func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) navigationAction과 decisionHandler를 가진 이 함수를 구현 return decisionHandler(.allow) // or return decisionHandler(.cancel) 특별한 일이 없다면 decisionHandler로 allow를 전달. URL에 의한 화면 이동, 로드를 막으려면 cancel로 전달 URL Scheme 얻어오기 if let url = navigationAction.request.ur.. 2022. 9. 26.
[iOS/Swift] WKWebView URL 로드 하기, Request 설정하기 private let wkWebView = WKWebView() 전역 변수 생성 var rootURL: URL? { didSet { setupRequest() } } 이니셜라이저로 설정해도 되고 rootURL 프로퍼티를 추가해서 didSet으로 옵저빙 rootURL이 설정되면 setupRequest()를 호출함 private func setupRequest() { guard let rootURL = rootURL else { return } print("\(rootURL) \(#file.split(separator: "/").last!)-\(#function)[\(#line)]") let request = URLRequest(url: rootURL) wkWebView.load(request) wkWebV.. 2022. 9. 26.
[iOS/RxSwift] RxSwift와 RxRealm으로 UICollectionView사용하기 Realm은 Object를 상속 받는 클래스를 타입으로 데이터 베이스에 저장된 객체들을 읽어 올 수 있습니다. private lazy var results = try! Realm().objects(Category.self) keyPath에 전달된 필드값으로 내림차순, 오름차순 정렬을 해서 전달 받을 수 있습니다. id 를 기준으로 오름차순 해주면 아래처럼 작성해 주면 됩니다. var updates = try! Realm().objects(Category.self).sorted(byKeyPath: "id", ascending: true) 이렇게 적어 주어도 되고 전역 변수로 realm 객체를 따로 빼주어도 됩니다 let realm = try! Realm() var updates = realm.objects.. 2022. 9. 19.
[iOS/Swift/Library] IQKeyboardManager FirstResponder된 UITextField와 UITextView가 화면에 보이도록 화면 위치를 자동으로 이동 시켜주는 라이브러리 AutoTool을 사용하면 키보드의 툴바로 다음 혹은 이전 UITextField나 UITextView로 이동할 수 있는 기능을 제공 함 IQkeyboardManager.shared.enable = true 를 AppDelegate나 SceneDelegate에 추가해 줌 class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchO.. 2022. 9. 16.