FastCampus IOS (05) - Firebase
업데이트:
데이터베이스에 저장한 값 불러오기
Int
rootRef.child("int").observeSingleEvent(of: .value) {
snapshot in print("---> \(snapshot)")
let value = snapshot.value as? Int ?? 0
DispatchQueue.main.async {
self.firstDataLabel.text = "\(value)"
}
}
Double
rootRef.child("double").observeSingleEvent(of: .value) {
snapshot in print("---> \(snapshot)")
let value = snapshot.value as? Double ?? 0.0
DispatchQueue.main.async {
self.firstDataLabel.text = "\(value)"
}
}
observeSingleEvent
데이터 베이스의 정보가 변해도 view 에서 보여주는 데이터는 변하지 않는다.
한번만 호출한다.
observe
데이터 베이스의 정보가 변경될때마다 실시간으로 변한다. 즉 콜백을 계속 호출한다.
복잡한 데이터 불러오기
fetchCustomers() 함수 생성
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// updateLabel()
// saveBasicType()
// saveCustomers()
fetchCustomers()
}
fetchCustomers() 함수정의
func fetchCustomers() {
let rootRef = Database.database().reference()
rootRef.child("customers").observeSingleEvent(of: .value) { (snapshot) in
self.firstDataLabel.text = "Son Dele Kane"
}
}
Customer 초기값 설정 parsing
struct Customer {
let id: String
let name: String
let books: [Book]
// ----- 여기부터
init(id: String, name: String, books: [Book]) {
self.id = id
self.name = name
self.books = books
}
init?(dict: [String: Any]) {
guard let id = dict["id"] as? String,
let name = dict["name"] as? String,
let bookList = dict["books"] as? [[String: Any]] else {
return nil
}
self.id = id
self.name = name
self.books = bookList.compactMap{ (dict) -> Book? in
return Book(dict: dict) // compactMap nil 로 표시되는건 다 버린다.
}
}
//---- 여기까지 추가
var toDictionary: [String: Any] {
let booksArray = books.map { $0.toDictionary }
let dict: [String: Any] = ["id": id, "name": name, "books": booksArray]
return dict
}
}
Book 초기값 설정 parsing
struct Book {
let title: String
let author: String
// --- 여기부터
init(title: String, author: String) {
self.title = title
self.author = author
}
init?(dict: [String: Any]) {
guard let title = dict["title"] as? String,
let author = dict["author"] as? String else {
return nil
}
self.title = title
self.author = author
}
// --- 여기까지 추가
var toDictionary: [String: Any] {
let dict: [String: Any] = ["title": title, "author": author]
return dict
}
}
fetchCustomers() name 출력 위한 함수 작성
func fetchCustomers() {
let rootRef = Database.database().reference()
rootRef.child("customers").observeSingleEvent(of: .value) { (snapshot) in
if let results = snapshot.value as? [[String: Any]] {
let customers = results.compactMap{ Customer(dict: $0) }
// let names = customers.map{ (customer) -> String in
// return customer.name
// }
let names = customers.map{ $0.name }
self.firstDataLabel.text = names.joined(separator: " ")
}
}
}
데이터 베이스 값 업데이트
func updateBasicTypes() {
let rootRef = Database.database().reference()
rootRef.updateChildValues(["int": 6])
rootRef.updateChildValues(["double": 5.4])
rootRef.updateChildValues(["array": ["cat", "banana"]])
}
댓글남기기