Search code examples
iosswiftaudionsuserdefaultsmpmediaitemcollection

How to retrieve data from NSUserDefaults?


currently, I try make an music playlist application. I try to save and retrieve playlist data from NSUserDefaults. I have no problem when saving the data but I got an error when retrieving data.

I got:

Terminating app due to uncaught exception 'MPMediaItemCollectionInitException', reason: '-init is not supported, use -initWithItems:

I'm following the answer from Play iPod playlist retrieved from a saved persistentid list but I try to write it in swift.

here is my save function:

func savePlaylist(var mediaItemCollection: MPMediaItemCollection){

    var items: NSArray = mediaItemCollection.items

    var listToSave: NSMutableArray = NSMutableArray()

    for song in items{

        var persistentId: AnyObject! = song.valueForProperty(MPMediaItemPropertyPersistentID)

        listToSave.addObject(persistentId)

    }

    var data: NSData = NSKeyedArchiver.archivedDataWithRootObject(listToSave)

    NSUserDefaults.standardUserDefaults().setObject(data, forKey: "songsList")
    NSUserDefaults.standardUserDefaults().synchronize()

}

and here is my retrieve function:

func setupMusic(){

    if NSUserDefaults.standardUserDefaults().objectForKey("songsList") != nil{

        var theList: NSMutableArray = NSMutableArray()

        var data: NSData = (NSUserDefaults.standardUserDefaults().objectForKey("songsList") as? NSData)!

        var decodedData: NSArray  = (NSKeyedUnarchiver.unarchiveObjectWithData(data) as? NSArray)!

        theList.addObjectsFromArray(decodedData as [AnyObject])

        var allTheSongs: NSMutableArray = NSMutableArray()

        for var i = 0; i < theList.count; i++ {

            var songQuery = MPMediaQuery.songsQuery()

            var songs: NSArray = songQuery.items

            allTheSongs.addObject(songs)

        }

        var currentQueue: MPMediaItemCollection = MPMediaItemCollection()

        myMusicPlayer?.setQueueWithItemCollection(currentQueue)


    }else{
        println("fail!!!!!!!!!!!!")
    }

}

How can I fix it?


Solution

  • Here is the issue var currentQueue: MPMediaItemCollection = MPMediaItemCollection()

    You must init with items

    As per the documentation by apple.

    init(items:) Designated Initializer

    Initializes a media item collection with an array of media items. Declaration

    Swift

    init!(items items: [AnyObject]!) Parameters items

    The array of items you are assigning to the media item collection.

    You have to init with items like

    var currentQueue: MPMediaItemCollection = MPMediaItemCollection(items:itemsArray)