1

In meinem Firebase-Projekt versuche ich Model View Controller Muster, so dass ich den Controller und die Klasse, die Firebase-Anfragen behandelt getrennt. Ich erhalte diese AusnahmeiOS Populate Tabellenansicht mit Firebase-Daten mit MVC-Muster

Ausnahme 'NSInvalidArgumentException' Grund: ‚- [__ NSCFNumber Länge]: Unbekannter Selektor an Instanz gesendet

Ich versuche, Nachrichten aus der Datenbank zu erhalten. Hier ist das Modell

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

Hier ist die Feuerbasis-Handler-Klasse

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

Ich kann die Kind-Werten gedruckt fein, aber das Problem ist, wenn ich das Protokoll Delegatmethode nennen.

Hier sind einige Teile der View-Controller-Klassentabelle, wo ich das NewsController Protokoll annehmen:

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

Dann implementieren I die Methode:

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

Die NewsItem nicht seit dem Fehler wird gedruckt tritt auf, bevor diese Methode aufgerufen wird, denke ich. Irgendwelche Vorschläge werden geschätzt.

Antwort

2

Vom berichtet NSNumber verwandten Fehler, würde ich Ihre timestamp Eigenschaft erraten tatsächlich als integer in Firebase gespeichert (und nicht als String). Wenn dies der Fall ist, versuchen Sie es zu ändern:

var timestamp: Int = 0 

Um zu verstehen, warum wir nicht über Int? (oder sogar Int!) see this answer bitte auch nutzen können.

Auch: Sie brauchen nicht DispatchQueue.main.async Wrapper in Ihrem Beobachtercode. Alle Datenbank Callbacks sind bereits am Firebase von Firebase aufgerufen;)

+0

Das war genau das :) Vielen Dank für Ihre Hilfe. – fullMoon

Verwandte Themen