【问题标题】:How to retrieve data from NSUserDefaults?如何从 NSUserDefaults 中检索数据?
【发布时间】:2015-06-01 04:51:11
【问题描述】:

目前,我尝试制作一个音乐播放列表应用程序。我尝试从 NSUserDefaults 保存和检索播放列表数据。我保存数据时没有问题,但检索数据时出现错误。

我明白了:

由于未捕获的异常“MPMediaItemCollectionInitException”而终止应用,原因:'-init 不受支持,请使用 -initWithItems:

我正在关注Play iPod playlist retrieved from a saved persistentid list 的答案,但我尝试用 swift 编写它。

这是我的保存功能:

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

}

这是我的检索功能:

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

}

我该如何解决?

【问题讨论】:

    标签: ios swift audio nsuserdefaults mpmediaitemcollection


    【解决方案1】:

    这里是问题var currentQueue: MPMediaItemCollection = MPMediaItemCollection()

    你必须init 与物品

    根据苹果的documentation

    初始化(项目:) 指定初始化器

    使用媒体项数组初始化媒体项集合。 声明

    斯威夫特

    初始化!(项目项目:[AnyObject]!) 参数 项目

    您分配给媒体项目集合的项目数组。

    您必须使用诸如

    之类的项目进行初始化
    var currentQueue: MPMediaItemCollection = MPMediaItemCollection(items:itemsArray)
    

    【讨论】:

    • 我应该把 init 放在哪里!(items items:[AnyObject]!)?
    • “itemsArray”从何而来?
    • 哦,好吧,我明白了。感谢您的帮助
    【解决方案2】:

    我为您提供了一种非常简单的方法来获取任何类型的对象并从 NSUserDefault 检索。 您不需要显式使用 archive 和 unarchive 。 只需创建一个 NSUserDefaults 类别如下

    #import <Foundation/Foundation.h>
    @interface NSUserDefaults (AKSNSUserDefaults)
    - (void)saveCustomObject:(id<NSCoding>)object
                         key:(NSString *)key;
    - (id<NSCoding>)loadCustomObjectWithKey:(NSString *)key;
    @end  
    
    @implementation NSUserDefaults (AKSNSUserDefaults)
    
    - (void)saveCustomObject:(id<NSCoding>)object
                         key:(NSString *)key {
        NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:object];
        [self setObject:encodedObject forKey:key];
        [self synchronize];
    
    }
    
    - (id)loadCustomObjectWithKey:(NSString *)key {
        NSData *encodedObject = [self objectForKey:key];
        id object = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject];
        return object;
    }
    
    @end
    

    并且您的 NSUserDefaults 已准备好存储任何对象。但有一件事是需要在您的对象模型中使用NSCoder

    例如:

    #import <Foundation/Foundation.h>
    
    @interface AKSClassA : NSObject<NSCoding>
    // declared some property 
    @property (nonatomic,assign) NSInteger userID;
    @property (nonatomic,strong) NSString *userName;
    @end
    #import "AKSClassA.h"
    @implementation AKSClassA
    @synthesize userID;
    @synthesize userName;
    -(id)initWithCoder:(NSCoder *)aDecoder{
        if (self = [super init]) {
    
            self. userID = [aDecoder decodeIntegerForKey:@"userID"];
            self. userName = [aDecoder decodeObjectForKey:@"userName"];
    
       }
        return self;
    }
    -(void)encodeWithCoder:(NSCoder *)aCoder{
        [aCoder encodeInteger:userID  forKey:@"userID"];
        [aCoder encodeObject:userName forKey:@"userName"];
    }
    @end
    // in some class if you are using classA object member to store and retrieve with value  example below 
    // to save data in NSUserDefaults 
      AKSClassA *obj =[array1 objectAtIndex:index];
      [[NSUserDefaults standardUserDefaults] saveCustomObject:button key:@"userData"];
    
    // to retrieve data 
     AKSClassA *obj1 = (AKSClassA*)[[NSUserDefaults standardUserDefaults]loadCustomObjectWithKey:@"userData"];
    
        [titleLabel  setText:obj1.userName];
    

    【讨论】:

    猜你喜欢
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多