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

iOS Populate Table View With Firebase Data Using MVC Pattern

在我的 Firebase 项目中,我尝试应用 Model View Controller 模式,因此我将控制器与处理 firebase 请求的 class 分开。 我得到这个例外

exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber length]: unrecognized selector sent to instance

我正在尝试从数据库中获取新闻条目。这是型号

class NewsItem: NSObject{
    var title: String?
    var detail: String?
    var photoUrl: String?
    var timestamp: String?
}

这是 firebase 处理程序 class

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

我可以很好地打印子值,但问题出在我调用协议委托方法时。

这里是 table 视图控制器 class 的一些部分,我在其中采用了 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()
}

newsItem 没有打印出来,我猜是因为错误发生在调用此方法之前。任何建议表示赞赏。

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

var timestamp: Int = 0

要了解为什么我们不能使用上面的 Int?(甚至 Int!),请也

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