Firebase DB에서 데이터를 가져올때 setValuesForKeys 메소드에서 오류가 발생했습니다.
반나절이상 헤메다가 발견한 해결법은 의외로 정말 간단했습니다.
다음은 Firebase DB의 변경사항을 관찰하고 있다가 데이터를 실시간으로 받아오는 observe메소드를 이용한 코드입니다.
가져온 데이터를 딕셔너리로 받아서 만들어 놓은 클래스에 객체로 집어 넣는 기능을 하는 메소드가 바로 setValuesForKeys이고 바로 여기서 에러가 발생했습니다.
func observeDB() {
Database.database().reference().child("users").observe(DataEventType.value, with: {(DataSnapshot) in
self.array.removeAll()
self.uidKey.removeAll()
for child in DataSnapshot.children {
let fchild = child as! DataSnapshot
if let dictionary = fchild.value as? [String:Any] {
let user = UserDTO()
let uidKey = fchild.key
user.setValuesForKeys(dictionary)
self.array.append(user)
self.uidKey.append(uidKey)
}
}
DispatchQueue.main.async {
self.collectView.reloadData()
self.activityIndicatorView.stopAnimating()
}
})
}
Objective-C에 Swift 코드를 노출하는 규칙이 Swift 4에서 상당히 변경되었다고 합니다.
setValuesForKeys API는 Foundation 프레임 워크에 의해 구현되며 Objective-C 호환성이 필요하고
Swift 4에서 Objective-C는 명시 적으로 노출하지 않으면 인스턴스 속성을 볼 수 없다고 합니다.
그래서 setValuesForKeys를 사용할 객체 클래스에 다음과 같이 @objcMembers 한 줄을 추가해야합니다
import UIKit
@objcMembers
class UserDTO: NSObject {
var uid: String?
var userId: String?
var subject: String?
var explaination: String?
var imageUrl: String?
var starCount: NSNumber?
var stars: [String:Bool]?
var imageName: String?
}
이렇게 간단하게 문제가 해결되었습니다.
댓글