개발일기/SwiftUI

MiniroomView Issue - Firebase 에서 받아온 정보로 다른 Collection 재조회 및 실시간 이미지 적용 (작업)

CODEMIING 2022. 4. 5. 09:37

지난번 정리한 내용을 작업하는 과정을 기록하려고 한다.

오늘 작업할 내용은 아래와 같다.

 

1. Firebase에서 데이터를 받아오는 부분과, 받아온 데이터를 Published 변수에 입력하는 부분을 분리해서 비동기 처리한다.

2. 화면 출력 여부를 Member Array 하나 단위로 관리할 수 있도록 한다.

2. roomData까지 한번에 첫번째 OB(ChatRoomOB)에서 조회하는 방법도 생각해보도록 한다.

 

 

이 과정에서 찾은 별개의 정보도 함께 기록해둔다.

> listener 제거 관련

https://fomaios.tistory.com/entry/Firebase-iOS-addSnapshotListener-여러번-호출되는-에러-해결하는법Detach-Listener

 

[Firebase iOS] addSnapshotListener 여러번 호출되는 에러 해결하는법(Detach Listener)

안녕하세요 Foma 입니다! 오늘은 Firestore에서 addSnaptshotListener를 다룰때 주의해야할 점에 대해서 적어보려고 합니다. addSnapshotListener를 사용할때 여러번 호출되는 경우인데요. 데이터가 바뀌었을때

fomaios.tistory.com

> Combine

https://medium.com/harrythegreat/swift-combine-%EC%9E%85%EB%AC%B8%EA%B0%80%EC%9D%B4%EB%93%9C2-publisher-subscribe-operator-723ed5d17e70

 

[Swift] Combine 입문가이드2 — Publisher, Subscribe, Operator

Publisher의 Subscriber의 종류

medium.com

> State, Binding, ObservableObject

https://medium.com/harrythegreat/swiftui-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC-5%ED%8E%B8-state-binding-observedobject-83c00c3317cb

 

SwiftUI 튜토리얼 5편 — @State, @Binding, @ObservedObject

다양한 바인딩 방법에대해 알아보기

medium.com

 

> sink, assign

https://sujinnaljin.medium.com/combine-sink-assign-3dc04b7b326f

 

[Combine] sink & assign

편하게 구독해보자✨

sujinnaljin.medium.com

 

1. Firebase에서 데이터를 받아오는 부분과, 받아온 데이터를 Published 변수에 입력하는 부분을 분리해서 비동기 처리한다 [완료]

  => 이 과정에서 @State, @Binding, @ObservedObject, Combine - sink 에 대한 이해가 모두 필요했다.

        Identifiable로 이루어진 ObservableObject 의 내부 MD 를 @Published 어노테이션을 통해 모두 각각의 Publisher로 변환하고,

       정보를 입력하는 부분과 변경된 부분으로 인한 트리거 작업을 sink Subscriber 선언을 통해 분리했다.

 

2. 화면 출력 여부를 Member Array 하나 단위로 관리할 수 있도록 한다. [완료]

=> ChatUserMD 에 show property 를 추가, member array 에서 remove 할 경우에는 show = false 를 먼저 수행한다.

 

3. roomData까지 한번에 첫번째 OB(ChatRoomOB)에서 조회하는 방법도 생각해보도록 한다.

 

2번까지 완료했음에도 불구하고, sink 호출은 class 에서만 가능하다는 이유로 문제가 해결되지 않아, 3번을 하려던 도중

문제가 있는 부분은 바로 View 를 리로드하는 제대로된 트리거가 없다는 점이라는 사실을 깨닫고, 알아본 결과

onReceive()를 이용하는 방법이 있어 적용했더니 바로 문제가 해결되었다.

기존에 사용하던 UserRoomOB는 사실상 네트워크통신용으로, Observable일 필요가 없어 일반 class로 변경했다.

 

수정된 코드는 아래와 같다.

 

.onReceive(Just(member.userId)) { value in
                            print("willSet\(value)")
                            let roomOB = UserRoomOB()
                            roomOB.readUserRoomData(value, initImages)
}

이로써 가장 큰 문제였던 부분들은 해결되어서,

다른 문제가 더 발생하더라도 쉽게 해결될 것으로 보인다.