1

Dans mon projet Firebase j'essaie d'appliquer Model View Controller pattern, donc j'ai séparé le contrôleur et la classe qui gère les requêtes firebase. je reçois cette exceptioniOS Populate Table View avec des données Firebase utilisant MVC Pattern

exception 'NSInvalidArgumentException', raison: « - [__ longueur NSCFNumber]: sélecteur non reconnu envoyé à l'instance

Je suis en train d'obtenir des éléments d'information de la base de données. Voici le modèle

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

Voici la classe gestionnaire 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) 
       } 
      } 
     } 
    } 
} 

Je peux obtenir les valeurs de l'enfant imprimé bien, mais le problème est quand je l'appelle la méthode délégué du protocole.

Voici quelques portions de la vue table de classe contrôleur où j'adopte le protocole NewsController:

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

Ensuite, je mets en œuvre la méthode:

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

Le NewsItem n'est pas imprimé depuis l'erreur se produit avant que cette méthode est appelée, je suppose. Toutes les suggestions sont appréciées.

Répondre

2

De l'erreur rapporté NSNumber liée, je suppose votre timestamp propriété est stockée comme un entier à Firebase (et non comme une chaîne ). Si tel est le cas, essayez de le changer à:

var timestamp: Int = 0 

Pour comprendre pourquoi nous ne pouvons pas utiliser Int? (ou même Int!) ci-dessus s'il vous plaît see this answer ainsi.

En outre: vous n'avez pas besoin de cette enveloppe DispatchQueue.main.async dans votre code d'observateur. Tous les rappels de base de données sont déjà appelé sur le fil principal par Firebase;)

+0

C'était exactement cela :) Merci d'avoir apprécié votre aide. – fullMoon