在我的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。任何建议都表示赞赏。
答案 0 :(得分:2)
根据报告的NSNumber
相关错误,我猜您的timestamp
属性实际上存储为Firebase中的整数(而不是字符串)。如果是这种情况,请尝试将其更改为:
var timestamp: Int = 0
要理解为什么我们也不能使用Int?
(或甚至Int!
)以上see this answer。
另外:您的观察者代码中不需要DispatchQueue.main.async
包装器。 Firebase已在主线程上已调用所有数据库回调;)