Swift iOS使用MVC模式用Firebase数据填充表视图
在我的Firebase项目中,我尝试应用模型-视图-控制器模式,因此我将控制器和处理Firebase请求的类分开。 我得到这个例外 异常“NSInvalidArgumentException”,原因:'-[\uu NSCFNumber length]:发送到实例的选择器无法识别 我正试图从数据库中获取新闻条目。这是模型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
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已在主线程上调用所有数据库回调;) 正是这样:)谢谢你的帮助。