firebase를 사용하여 데이터를 가져올 경우 제목가 같은 에러를 확인할 경우가 있습니다. 제목에서 보여준 에어인 The data couldn’t be read because it is missing 은 존재하지 않은 데이터가 있어서 파싱을 할 수 없을 경우 나타나는 에러입니다. 이 경우 어떻게 처리하는지 알아보도록 하겠습니다.
1. 에러가 나는 예제
저 같은 경우에는 firebase의 storage를 사용하여 데어트를 관리하는데 그중 문서(document)에 존재하는 필드가 추가될 경우 이전의 존재하는 문서(document)에 필드가 추가되지 않았고, 그 추가되지 않은 문서를 호출하여 decoding 할 경우 위와 같은 error를 확인하게 되었습니다. 예를 들어 아래 코드처럼 사용자 정보 문서를 여러 개 가져올 경우의 코드를 사용할 경우에 User class의 변수(파이어베이스 입장에서는 필드)가 추가되는 경우에, 이 추가된 변수가 없는 경우 위 error가 발생합니다.
let usersRef = self.db.collection(user).whereField("userid", in: userIds)
usersRef.getDocuments { snapshot, error in
if let error = error {
observer.onError(error)
} else if let snapshot = snapshot {
var userList: [User] = []
for document in snapshot.documents {
do {
let chatMsg = try document.data(as: User.self)
userList.append(chatMsg)
} catch {
print(error.localizedDescription)
}
}
observer.onNext(userList)
}
observer.onCompleted()
}
return Disposables.create()
2. 확인 방법
확인 방법은 2가지가 있습니다.
1. json 파싱
document의 데이터를 직접 일일이 파싱하여 데이터를 확인하여 문제점을 찾는 방법입니다.
2. xcode 콘솔 활용
1번의 경우 일일이 파싱 하기 위해서 많은 코딩이 필요합니다. 하지만 xcode 콘솔을 활용하면 쉽게 없는 데이터 확인이 가능합니다.
브레이크를 걸고 디버그 중 위 이미지의 콘솔 부분에 p "데이터 이름"을 입력하면 관련 데이터를 확인할 수 있습니다. 그 데이터를 통하여 없는 데이터를 확인 할 수 있습니다.
xcode 콘솔 관련 명령어는 https://ohgyun.com/635 에서 확인하실 수 있습니다.
3. 해결 방법
해결 방법은 간단합니다. 없는 데이터를 옵셔널 타입으로 변경하면 없는 경우에는 패스하여 데이터를 파싱 해줍니다.
예를 들어 아래 코드처럼 User class가 기존에서 신규로 변경될 경우 신규로 추가된 값을 옵셔널로 처리해주면 그 변수가 없는 문서를 가져오더라도 정상적으로 decoding 할 수 있습니다.
// 기존
struct User {
var userId: String
var name: String
var email: String
}
// 신규
struct User {
var userId: String
var name: String
var email: String
var isActive : Bool?
}
'2023년 부터 > iOS&Swift' 카테고리의 다른 글
[iOS] ScrenDelegate 와 Appdelegate에서 navigationViewcontroller 호출하기 (0) | 2024.02.08 |
---|---|
[iOS/Swift]OneLink 적용 및 테스트 방법 (0) | 2024.02.08 |
[iOS] 공백만 입력되었는지 체크하는 로직 (0) | 2024.01.12 |
[iOS] Android System.currentTimeMillis 사용하기 (1) | 2023.11.25 |
[iOS] iOS 개발에서의 핵심 이해: sizeToFit과 sizeThatFits (1) | 2023.11.21 |