๐Ÿ•บํŒŒ์ด์–ด๋ฒ ์ด์Šค์—์„œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ์œ ์ € ์ƒ์„ฑํ•˜๊ธฐ(+didSet)

sangheeยท2021๋…„ 9์›” 2์ผ
0

๐Ÿ”ฅFirebase

๋ชฉ๋ก ๋ณด๊ธฐ
5/5
post-thumbnail

๋ชฉํ‘œ

ํŒŒ์ด์–ด๋ฒ ์ด์Šค๋กœ๋ถ€ํ„ฐ ์œ ์ € ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ์œ ์ €๋ฅผ ์ƒ์„ฑํ•ด๋ณธ๋‹ค.

1. ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

Service๋ผ๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์˜€๋‹ค. ์—ฌ๋Ÿฌ ๋ทฐ์—์„œ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ๋œ shared์™€ ํ˜„์žฌ ์œ ์ €์˜ uid๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. fetchUserDataํ•จ์ˆ˜๋กœ ํŒŒ์ด์–ด๋ฒ ์ด์Šค์—์„œ ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž…์˜ ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์™€ user๋ฅผ ํด๋กœ์ ธ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

import Firebase

struct Service {
    
    static let shared = Service()
    let currentUid = Auth.auth().currentUser?.uid
    
    func fetchUserData(completion: @escaping(User) -> Void) {
        guard let currentUid = currentUid else { return }
        REF_USERS.child(currentUid).observeSingleEvent(of: .value) { snapshot in
            guard let dict = snapshot.value as? [String: Any] else { return }
            let user = User(dict: dict)

            completion(user)
        }
    }
}

์œ„์—์„œ ์‚ฌ์šฉํ•œ REF_USERS๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

let DB_REF = Database.database().reference().child("users")
let REF_USERS = DB_REF.child("users")

2. ์œ ์ € ๋ชจ๋ธ ๋งŒ๋“ค๊ธฐ

์œ ์ € ๋ชจ๋ธ์„ ๋งŒ๋“ ๋‹ค. ์œ ์ €๋Š” ํ˜„์žฌ username, email, accountType์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์œ„์—์„œ ๋ฐ›์€ dict๋กœ ๊ฐ’๋“ค์„ ํ• ๋‹นํ•œ๋‹ค.

import Foundation

struct User {
    let username: String
    let email: String
    let accountType: Int
    
    init(dict: [String: Any]) {
        self.username = dict[KEY_USERNAME] as? String ?? ""
        self.email = dict[KEY_EMAIL] as? String ?? ""
        self.accountType = dict[KEY_ACCOUNTTYPE] as? Int ?? 0
    }
}

3. ๋ทฐ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ

HomeController์—์„œ ๋ทฐ๊ฐ€ ๋กœ๋“œ๋˜๋ฉด ์œ ์ € ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ๋จผ์ € ์ƒ์„ฑ๋œ Service์—์„œ fetchUserData ํ•จ์ˆ˜๋กœ๋ถ€ํ„ฐ user๋ฅผ ์–ป์–ด user์— ํ• ๋‹นํ•œ๋‹ค.

didSet์€ ๋ง ๊ทธ๋Œ€๋กœ set์ด ๋˜๋ฉด ์‹คํ–‰๋œ๋‹ค. didSet์€ willSet๊ณผ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ ์งํ›„์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๋ฉฐ ํ•ด๋‹น ์‹œ์ ์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. user๊ฐ€ ์ €์žฅ๋˜๋ฉด(๊ฐ’์ด ๋ณ€๊ฒฝ๋จ) ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

private var user: User? {
    didSet { locationInputView.user = user }
}

override func viewDidLoad() {
    super.viewDidLoad()
    ...
    fetchUserData()
}

private func fetchUserData() {
    Service.shared.fetchUserData { user in
        self.user = user
    }
}

4. user๋ฐ›๊ณ  ๋ทฐ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ

์—ญ์‹œ didSet์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค. user๊ฐ€ ํ• ๋‹น๋˜๋ฉด titleLabel์˜ ํ…์ŠคํŠธ๋ฅผ ์œ ์ €์˜ ๋‹‰๋„ค์ž„์œผ๋กœ ์ €์žฅํ•œ๋‹ค.

class LocationInputView: UIView {
    
    var user: User? {
        didSet { titleLabel.text = user?.username }
    }
    
    private let titleLabel: UILabel = {
        let label = UILabel()
        label.font = UIFont.systemFont(ofSize: 16)
        label.textColor = .systemGray
        return label
    }()
    ....

์ฐธ๊ณ ์‚ฌ์ดํŠธ

๊นƒํ—ˆ๋ธŒ ์ปค๋ฐ‹ ๋งํฌ

profile
๐Ÿ‘ฉโ€๐Ÿ’ป

0๊ฐœ์˜ ๋Œ“๊ธ€