๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ „์ฒด ๊ธ€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.