Swift iOS使用MVC模式用Firebase数据填充表视图

Swift iOS使用MVC模式用Firebase数据填充表视图,swift,uitableview,firebase,firebase-realtime-database,key-value-coding,Swift,Uitableview,Firebase,Firebase Realtime Database,Key Value Coding,在我的Firebase项目中,我尝试应用模型-视图-控制器模式,因此我将控制器和处理Firebase请求的类分开。 我得到这个例外 异常“NSInvalidArgumentException”,原因:'-[\uu NSCFNumber length]:发送到实例的选择器无法识别 我正试图从数据库中获取新闻条目。这是模型 class NewsItem: NSObject{ var title: String? var detail: String? var photoUrl

在我的Firebase项目中,我尝试应用模型-视图-控制器模式,因此我将控制器和处理Firebase请求的类分开。 我得到这个例外

异常“NSInvalidArgumentException”,原因:'-[\uu NSCFNumber length]:发送到实例的选择器无法识别

我正试图从数据库中获取新闻条目。这是模型

class NewsItem: NSObject{
    var title: String?
    var detail: String?
    var photoUrl: String?
    var timestamp: String?
}
下面是firebase处理程序类

protocol NewsController: class {
    func fetchedNews(_ newsItem: NewsItem)
}

class FirebaseHandler {

    private static let _instance = FirebaseHandler()

    static var Instance: FirebaseHandler{
        return _instance
    }

    weak var newsControllerDelegate: NewsController?

    func fetchNews() {
        References.Instance.newsRef.observe(.childAdded) { 
            (snapshot: DataSnapshot) in
            if let child = snapshot.value as? [String: AnyObject]{
                let newsItem = NewsItem()
                print("CHILD: \n\n\n\n\(child)\n\n\n")
                newsItem.setValuesForKeys(child)
                DispatchQueue.main.async {
                    self.newsControllerDelegate?.fetchedNews(newsItem)
                }
            }
        }
    }
}
我可以很好地打印子值,但问题是当我调用protocoldelegate方法时

下面是table view controller类的一些部分,其中我采用了
NewsController
协议:

FirebaseHandler.Instance.newsControllerDelegate = self
FirebaseHandler.Instance.fetchNews()
然后我实现该方法:

func fetchedNews(_ newsItem: NewsItem) {
    print("Item:\n\n\n\(newsItem)\n\n\n")
    self.newsItems.append(newsItem)
    self.tableView.reloadData()
}

由于错误发生在调用此方法之前,因此未打印新闻项。非常感谢您的建议。

根据报告的
NSNumber
相关错误,我猜您的
timestamp
属性在Firebase中实际存储为整数(而不是字符串)。如果是这种情况,请尝试将其更改为:

var timestamp: Int = 0
为了理解为什么我们不能使用上面的
Int?
(或者甚至
Int!
)也请理解

另外:在观察者代码中不需要
DispatchQueue.main.async
包装器。Firebase已在主线程上调用所有数据库回调;)

正是这样:)谢谢你的帮助。