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

时间:2017-06-10 15:49:50

标签: swift uitableview firebase firebase-realtime-database key-value-coding

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

  

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

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

import sys
from string import ascii_lowercase
import pygame as pg


def main():
    screen = pg.display.set_mode((640, 480))
    clock = pg.time.Clock()
    font = pg.font.Font(None, 90)
    font_color = pg.Color('aquamarine1')
    index = 0
    txt_surface = font.render(ascii_lowercase[index], True, font_color)
    counter = 8  # To limit the updates to one per eight frames.

    done = False

    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True

        counter -= 1
        if counter <= 0:
            counter = 8
            index += 1
            index %= len(ascii_lowercase)
            txt_surface = font.render(ascii_lowercase[index], True, font_color)

        screen.fill((30, 30, 30))
        screen.blit(txt_surface, (140, 140))

        pg.display.flip()
        clock.tick(30)


if __name__ == '__main__':
    pg.init()
    main()
    pg.quit()
    sys.exit()

这是firebase处理程序类

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

我可以很好地打印子值,但问题是当我调用protocol delegate方法时。

以下是我采用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) } } } } } 协议的表视图控制器类的一些部分:

NewsController

然后我实现了方法:

FirebaseHandler.Instance.newsControllerDelegate = self
FirebaseHandler.Instance.fetchNews()

由于在我调用此方法之前发生错误,因此不会打印newsItem。任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:2)

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

var timestamp: Int = 0

要理解为什么我们也不能使用Int?(或甚至Int!)以上see this answer

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