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

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

 

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)
}

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

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

제목을 줄여서 쓰느라 머리가 좀 아팠다.

글로 정리하려니 역시, 현재 발생하고 있는 문제 자체도 한마디로 정의하기가 어려운 상황이라는 생각이 든다.

문제가 발생할 수 있는 부분, 그리고 바꿔서 적용해볼 수 있는 부분이 너무 많기 때문이다.

 

일단 기능적인 측면에서 현재 발생하고 있는 문제는 이렇다.

 

# 채팅 대기화면에서 사람이 2명 이상 동시에 나갈 경우 에러 발생

# 카운트다운이 진행되는 동안 계속해서 깜빡거림 발생

 

이렇게 두가지인데, 위 문제들을 해결하는 과정에서 데이터가 너무 많은 단계를 거쳐서 이동하고 있기도 하고,

특히 문제가 되는 부분은 첫번째 정보(userEmail)를 넘겨서 두번째 정보(room setting) 를 받아오는 부분이다.

첫번째 정보가 단일 건이 아닌 Array로 존재하기 때문에,

변경사항이 있을 경우 화면에서 이 문제를 출력하기 위해 발생시키는 [out of Range error]

이 녀석이 바로 문제의 주 원인인데,

솔직히 말해서 이 에러를 스위프트에서 자체적으로 핸들링해주고 있지 않다는 것에실망감도 꽤 크다.

 

너무 모든것을 복잡하게 생각해서 더 어렵게 느껴지는 것 같은데, 기존에 했던 것처럼 문제 자체에 집중해 보도록 한다.

일단 두번째 이슈의 경우, 기존에 존재하지 않았던 이슈인데 첫번째 문제를 벗어나기 위해 조정하다가 생겨난 문제이므로

두번째 이슈를 먼저 정리해보도록 한다.

 

위 내용에 대해 잠시 생각하다보니 기존 코드에서 'Member' 정보를 한번에 변경하는 부분을 제거하고,

Array 하나 단위로 show(화면 출력 여부)를 미리 관리하게 되면 두 가지 문제를 동시에 해결할 수도 있을 것 같다는 생각이 든다.

 

그런데 그 전에, 함수의 비동기 처리와 Completion Handler 등 swift 자체에 대한 이해도가 조금 더 높아진 상태에서

현재 함수 상태를 보니 정보를 받아오는 부분과, 내부 변수를 변경하는 부분을 분리해서 처리할 필요가 있어 보인다.

 

위 내용을 토대로 아래 내용을 순서대로 작업해보기로 한다.

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

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

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

+ Recent posts