[Swift판] 이제 들리지 않는 Firebase④ Realtime Database

소개



지금 들을 수 없는 Firebase 시리즈 제4탄은 Realtime Database의 구현 방법에 대해 소개합니다.

Realtime Database가 할 수 있는 일



· 스토리지에서 데이터 관리 (JSON Tree)
・실시간으로 데이터를 갱신할 수 있다(수밀리초 정도)
・오프라인에서도 이용 가능

설명하는 예



이번에는 제목과 완료된 플래그를 관리하는 예에서 설명합니다.

ToDo.swift
import Foundation

class ToDo: NSObject {
    var title = ""
    var isDone = false

    init(title: String, isDone: Bool) {
        self.title = title
        self.isDone = isDone
    }
}

스토리지에서는 다음과 같이 관리되는 가정입니다.
(Firebase의 Database는 하나의 큰 JSON Tree로 관리되는 것 같습니다)




키 이름
설명
보충


realtimedatabase-d0734
데이터베이스 이름
자동으로 할당

user-todolist
테이블 이름

7y5Cqzcnj7Ztrn408qLPqvuqWlp1
사용자 ID
FIRAuth.auth()?.currentUser?.uid

KOSR7Jx7RknVe3LAxyT
기본 키
자동으로 할당

title
이번에 등록할 데이터
문자열

isDone
이번에 등록할 데이터
Bool


할 일



· Realtime Database의 도입 방법에 대해서
· 데이터 등록, 데이터 읽기 샘플 코드 소개

하지 않는 것



· Firebase 배포 정보
· 회원 등록, 로그인에 대해

막상 도전!



1. 도입 방법



1.1. Podfile에 모듈 추가



또한 Auth는 사용자별로 데이터를 관리하는 데 사용합니다.

Podfile
    pod 'Firebase'
    pod 'Firebase/Auth'
    pod 'Firebase/Database'

2. 구현



2.1. Firebase 모듈 가져오기



Realtime Database를 사용하는 클래스에서 import
import Firebase
import FirebaseDatabase

2.2. 데이터 등록



데이터 등록은 저장하려는 계층까지 슬래시로 구분하여 지정합니다.
userID는 로그인시 얻은 uid를 지정합니다.

ViewController.swift
    private func addToDoItem(userID: String, todo: ToDo) {

        let ref = FIRDatabase.database().reference()
        let key = ref.child("todolist").childByAutoId().key
        let childUpdates = ["/user-todolist/\(userID)/\(key)/": ["title": todo.title, "isDone" : todo.isDone]]

        ref.updateChildValues(childUpdates)
    }


2.3. 데이터 읽기



데이터 읽기는 비동기 적으로 검색되므로 대리자를 정의합니다.

ViewController.swift
protocol ToDoImtesInput {
    func success(todoItems: [ToDo])
    func failure(error: NSError)
}

사용자 ID별로 데이터를 읽고, 읽기 완료 후 델리게이드로 통지

ViewController.swift
    private func loadTodoItems(userID: String){

        let ref = FIRDatabase.database().reference()
        ref.child("user-todolist").child(userID).observeSingleEventOfType(.Value, withBlock: {[weak self] (snapshot) in

            guard let weakSelf = self else  { return }

            var todoItems = [ToDo]()

            for item in snapshot.children {
                let child = item as! FIRDataSnapshot
                let dic = child.value as! NSDictionary

                todoItems.append(ToDo(title: dic["title"] as! String, isDone: dic["isDone"] as! Bool))
            }
            weakSelf.success(todoItems)

        }) {[weak self] (error) in
            guard let weakSelf = self else  { return }
            weakSelf.failure(error)
        }
    }

읽은 데이터 표시

ViewController.swift
extension ViewController: ToDoImtesInput {

    func success(todoItems: [ToDo]) {

        for todoItem in todoItems {
            print(todoItem.title, todoItem.isDone)
        }
    }

    func failure(error: NSError) {
        print(error.description)
    }
}

요약



이번에는 Realtime Database의 구현 방법에 대해 소개했습니다.
스토리지로 관리하는 데이터는, 그 밖에도 룰 설정을 할 수 있어 액세스 제한등을 할 수 있는 것 같습니다.

앞으로는 여러 테이블의 예도 모아보고 싶습니다.

좋은 웹페이지 즐겨찾기