Firebase Model Framework Salada를 사용하여 사용자 모델 만들기

Firebase Model Framework Salada를 사용하여 사용자 모델 만들기


저는 Firebase에 대해 실천적인 내용을 보도하지 않고 평소에 제가 응용 프로그램에서 사용하는 사용자 모델을 소개하고 싶습니다.
이 문장 소개
  • Salada 설치
  • Firebase로 사용자 모델 만들기
  • Firebase Auth를 User Model과 공동 작업
  • Salada 설치


    드디어 Salada Cococapods에 대응했다.
    설치할 때pod1.4 이상을 사용해야 합니다.
    우리 먼저 코코아팟을 업데이트합시다.
    $ gem install cocoapods --pre
    그리고 평소처럼 Podfile에 이걸 쓰세요.
    pod 'Salada'
    설치 완료!
    각 문서가 어떤 역할을 하는지 자세히 물어보고 싶은 사람Twiiter에게 Qiita에게 물어보세요.나는 기꺼이 대답한다.

    Firebase로 사용자 모형 만들기


    우리 바로 사용자 모형을 만들자.User.swift도 괜찮지만 Realm에서 같은 사용자 모델을 만들 때 이름이 충돌하는 것을 싫어하기 때문에 그 이후로 저는 Firebase+User.swift가 되었습니다.Firebase Auth도 User로 정의된 반이 있기 때문에 그에게 이름 공간을 주는 것이 가장 좋다.

    이번에는 간단하지만 사용하기 좋은 구성을 소개합니다.
    import Firebase
    
    extension Firebase {
        class User: Object {
    
            @objc dynamic var name: String?
    
            @objc dynamic var thumbnailImage: File?
    
            let followers: Follower = []
    
            let friends: Friend = []
        }
    }
    
    사용자 이름, 축소판 그림 및 추적 기능을 제공합니다.File FirebaseStorage와 원활하게 협업할 수 있습니다.
    extension Firebase.User {
    
        static func current(_ completionHandler: @escaping ((Firebase.User?) -> Void)) {
            guard let user: User = Auth.auth().currentUser else {
                completionHandler(nil)
                return
            }
            Firebase.User.observeSingle(user.uid, eventType: .value, block: { (user) in
                guard let user: Firebase.User = user else {
                    // FirebaseのDBにUserが保存されていない場合はログアウトする
                    _ = try? Auth.auth().signOut()
                    completionHandler(nil)
                    return
                }
                completionHandler(user)
            })
        }
    
        // ユーザーをフォローする
        public func follow() {
            Firebase.User.current { (me) in
                guard let me = me else { return }
                self.followers.insert(me)
                me.friends.insert(self)
            }
        }
    
        // ユーザーをフォローをやめる
        public func unfollow() {
            Firebase.User.current { (me) in
                guard let me = me else { return }
                self.followers.remove(me)
                me.friends.remove(self)
            }
        }
    }
    
    Relation 클래스를 상속하면 참조를 쉽게 생성할 수 있습니다.
    extension Firebase {
        // フォローしている
        class Follower: Relation<Firebase.User> {
    
        }
    }
    
    extension Firebase {
        // フォローされている
        class Friend: Relation<Firebase.User> {
    
        }
    }
    

    사용자 저장

    let user: Firebase.User = Firebase.User()
    user.name = "hoge"
    user.thumbnailImage = File(data: UIImageJPEGRepresentation(image, 1))
    user.save()
    

    사용자 액세스

    Firebase.User.current { user in
        // Do something
    }
    

    다른 사용자 액세스

    Firebase.User.observeSingle("id", eventType: .value) { (user) in
        // Do something      
    }
    

    속성 업데이트

    Firebase.User.current { user in
        user.name = "Update"
    }
    
    Salada는 업데이트 기능을 제공하지 않습니다.
    이제 속성을 모니터링하고 값을 설정할 때 실시간으로 Firebase에 저장할 수 있습니다.
    그러니까 새 값만 설정해줄게.왜 이렇게 됐는지 말하자면 Firebase가 오프라인에서도 사용할 수 있기 때문이다.
    오프라인일 때 오류를 처리할 필요가 없습니다.원래 Firebase는 시간을 초과하는 개념도 없고 오류를 되돌려주지도 않았다.오프라인이면 로컬에 잠시 저장되고 네트워크에 다시 연결할 때 Firebase 호스트와 동기화됩니다.

    Firebase Auth를 사용자 모델과 공동 작업


    실제로 이것은 상당히 번거롭다. Firebase Auth는 인증이 끝난 후에 AuthStateDidChange 같은 Notification을 건너뛰지만, 실제로 원하는 Notification은 인증이 끝난 후에 사용자가 만든 후에 더욱 즐겁다.
    Auth.auth().signIn(with: credential) { (authUser, error) in
        guard let authUser = authUser else {
            print(error)
            return
        }
    
        // AuthStateDidChangeはこの時点で飛んじゃう。
        Firebase.User.observeSingle(authUser.uid, eventType: .value) { user in
            if let user = user {
                // すでにユーザーがある場合はそのままログイン
            } else {
                // ない場合はユーザーを作る
                let newUser: Firebase.User = Firebase.User(id: authUser.uid)!
                newUser.name = authUser.displayName
                newUser.save { (_, error) in
                    if let _ = error {
                        print(error)
                        return
                    }
                    // ここで自前のNotificationを飛ばしましょう。
                }
            }
        }
    }
    
    그럼 좋은 Firebase Life 하나 보내주세요.

    좋은 웹페이지 즐겨찾기