์ ์ฒด ๊ธ179 [RxSwift] RxDataSources๋ก UITableView ์ ๋ฐ์ธ๋ฉ ํ๊ธฐ ๋ณดํธ๋์ด ์๋ ๊ธ ์ ๋๋ค. 2022. 10. 10. [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. [Framer] Figma ํ๋ก์ ํธ Framer๋ก ์ด๋์ํค๊ธฐ(Importing) Framer๋ ํ๋กํ ํ์ ์ ์ต์ ํ๋ ํด์ ๋๋ค. ๊ธฐ์กด์ ์ค์ผ์น๋ ํผ๊ทธ๋ง๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ์งํํ๊ณ ์์๋ค๋ฉด ์ด๋ฅผ Framer์ ๊ฐ์ง๊ณ ์์ ์์ ์ ์งํ ํ ์ ์์ต๋๋ค ๐ฅณ Figma์์ Framer๋ก ์ด๋ ์ํค๊ธฐ ์ํ ํ๋ฌ๊ทธ์ธ์ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ํผ๊ทธ๋ง์ ๋์ฌ ๋ณด๋์์ ์์ ํ์ผ๋ก ์ด๋ํฉ๋๋ค ํ๋๋จธ๋ก ์ํฌํธํ ๋ ์ด์ด๋ฅผ ๋๋๊ทธ ํน์ ์ ํํด ์ค๋๋ค. ๊ทธ ํ ์๋จ์ ๋ํ ์ฌ๋ฌ๊ฐ๊ฐ ๊ทธ๋ ค์ ธ ์๋ ์์ด์ฝ์ ๋๋ฅธ ๋ค Plugins์์ "Figma to HTML with Framer"๋ฅผ ๊ฒ์ํด ์ค๋๋ค. ์ ์ด๋ฏธ์ง์์ ๋๋ฒ์งธ์ ์๋ ํ๋ฌ๊ทธ์ธ์ด ์ฌ์ฉํ ํ๋ฌ๊ทธ์ธ์ ๋๋ค. ํ๋ฌ๊ทธ์ธ์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ ธ์ ๋ ๋ํ๋๋ "Run"๋ฒํผ์ ๋๋ฅด๋ฉด ํผ๊ทธ๋ง์ ๋ ์ด์ด๋ฅผ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌํ๊ฒ ๋ฉ๋๋ค. ์ ์ฐฝ์ด ๋ํ๋๋ค๋ฉด "Copy to clip.. 2022. 9. 25. ์ด์ 1 2 3 4 5 6 7 8 ยทยทยท 15 ๋ค์