2017-07-06 4 views
0

Dans mon UIViewController, j'appelle une méthode dans une autre classe qui me renvoie une liste de NSManagedObjects, que j'instancie dans un tableau. Voici le code:Pourquoi mon tableau de NSManagedObjects perd-il ses propriétés?

fileprivate var albumList = [Album]() 

private func loadAlbums() { 
    APIHandler().getUsersAlbums() { 
     albums in 
     self.albumList = albums 
     self.collectionView?.reloadData() 
    } 
} 

Mais c'était à l'origine de mon choix d'avoir nul propriétés une fois loadAlbums était terminée et l'instance de APIHandler effacé. Je résolu ce problème pour l'instant en ayant une instance de APIHandler sur mon UIViewController et appeler la fonction à partir de là, comme ceci:

let api = SpotifyAPIHandler() 
fileprivate var albumList = [Album]() 

private func loadAlbums() { 
    api.getUsersAlbums() { 
     albums in 
     self.albumList = albums 
     self.collectionView?.reloadData() 
    } 
} 

Cependant, je ne suis pas heureux avec cela. Pourquoi cela arrive-t-il? Comment est-ce que je peux instancier une toute nouvelle liste?

+1

NSManagedObjects est une classe, pas un pointeur. Veuillez reformuler votre question. Si vous voulez créer un nouvel objet géré basé sur un objet existant, vous devez le copier. Pour plus de détails, voir: https://stackoverflow.com/questions/2730832/how-can-i-duplicate-or-copy-a-core-data-managed-object – ninjaproger

+0

Je ne vois pas de problèmes flagrants avec votre code. Après que votre 'loadAlbums()' soit terminé, vous devriez avoir tous vos albums sauvegardés. Que voulez-vous dire que votre tableau a des propriétés nulles? Ne voyez-vous rien dans votre collectionVoir? Avez-vous défini votre collectionViewDataSource et collecitonView.delegate? – cloudcal

+0

Mon tableau a un NSManagedObject valide sur chaque position, mais si j'essaie d'obtenir albumList [0] .name, par exemple, le nom sera nul –

Répondre

0

Je pense que ce qui se passe vous est en train de créer une nouvelle instance de APIHandler chaque fois que vous appelez la loadAlbums()func place ce que vous pouvez faire est d'avoir un static refrence de ur APIHander dans le APIHanderclass comme si

class APIHander: NSObject { 
    static let handler = APIHander() 
} 

Ensuite, vous appelez votre API comme ce

private func loadAlbums() { 
    APIHandler.handler.getUsersAlbums() { 
     albums in 
     self.albumList = albums 
     self.collectionView?.reloadData() 
    } 
} 
+0

Je ne pense pas que ce soit le problème car il est dealloc'd après 'loadAlbum()' est terminé - les données sont enregistrées à chaque fois, donc je pense que c'est bien. – cloudcal