2017-11-13 1 views
0

Firebase 실시간 데이터베이스를 사용하고 있습니다. 데이터 구조는 사용자가 주석을 달고 좋아할 수있는 게시물의 배열입니다.Swift를 사용하여 firebase 실시간 데이터베이스와 데이터 소스를 동기화하는 방법은 무엇입니까?

는이 같은 데이터를 검색하고 로컬 posts 배열에 넣어 : 그들은 제대로 표시되지 지금까지 아무런 문제가있다

ref.observe(.childAdded, with: { (snapshot) -> Void in 
    self.posts.append(snapshot) 
    self.tableView.reloadData() 
}) 

. 이제 사용자 이 (가)의 게시물을 좋아한다고 가정 해 보겠습니다. 나는 이드를 likers 배열에 추가하여 로컬 posts 배열에 게시물을 배열합니다. 그러나 firebase 데이터베이스는 아직 이것을 모릅니다.

제 질문은 로컬 데이터와 파이어베이스 데이터를 동기화하는 올바른 방법은 무엇입니까?

답변

0

Firebase의 트릭은 대개 사용자가 게시물을 좋아하는 것과 같은 작업을 수행 할 때만 데이터베이스를 업데이트하는 것입니다. 그런 다음 데이터베이스 업데이트에서 새로운 이벤트를 얻습니다 (예 : .childChanged, 좋아하는 항목 업데이트). 그런 다음 데이터베이스의 이벤트를 기반으로 UI를 업데이트합니다.

반응식 모델이라고도하며 공식적으로는 Command Query Responsibility Segregation이라고도합니다. 쿼리의 흐름 (데이터베이스에서보기로)에서 사용자 (데이터베이스)의 명령 흐름을 분리합니다.

+0

답해 주셔서 감사합니다. 그건 의미가 있지만 단점은보기를 바로 업데이트하는 것이 더 느리다는 것입니다. –

+0

아닙니다. Firebase의 Database는 서버에 명령을 보내기 전에 로컬'.childChanged' 명령을 실행하므로 거의 즉각적입니다. 또한 서버가 쓰기 작업을 거부하는 경우와 같이 가장자리의 경우를 처리합니다. 하지만 중요한 것은 다음과 같습니다. 1) 사용자가 기대하는 동작을 얻습니다 (빠른 업데이트). 2)이를 처리 할 특정 코드를 작성할 필요가 없습니다. –

0

DatabaseHandler를 사용해야합니다. 데이터베이스를 청취하고 viewcontroller를 종료 할 때 핸들러를 제거해야합니다.

fileprivate lazy var ref = Database.database().reference().child("...") 
private var yourHandler: DatabaseHandle? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    yourHandler = ref.observe(.childAdded, with: { (snapshot) -> in 
     self.posts.append(snapshot) 

     DispatchQueue.main.async { 
     self.tableView.reloadData() 
     } 
    }) 
} 

deinit { 
    if let handler = yourHandler { 
     ref.removeObserver(withHandle: handler) 
    } 
} 

이제 데이터베이스에 새 항목을 추가하면 처리기가이 항목을 가져 와서 뷰 컨트롤러에 표시합니다. 주 : 항상 메인 스레드에서 reloadData() 메소드를 호출하십시오.

+0

이미 게시물을 표시 할 수 있습니다. 내 질문은 그들을 수정하는 방법입니다. –

관련 문제