ํ์ด์ด๋ฒ ์ด์ค๋ก๋ถํฐ ์ ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ์ ์ ๋ฅผ ์์ฑํด๋ณธ๋ค.
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")
์ ์ ๋ชจ๋ธ์ ๋ง๋ ๋ค. ์ ์ ๋ ํ์ฌ 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
}
}
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
}
}
์ญ์ 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
}()
....