如何从 NSUserDefaults 检索数据?
How to retrieve data from NSUserDefaults?
目前,我正在尝试制作一个音乐播放列表应用程序。我尝试从 NSUserDefaults 保存和检索播放列表数据。我在保存数据时没有问题,但在检索数据时出现错误。
我得到了:
Terminating app due to uncaught exception 'MPMediaItemCollectionInitException', reason: '-init is not supported, use -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!!!!!!!!!!!!")
}
}
我该如何解决?
这里是问题var currentQueue: MPMediaItemCollection = MPMediaItemCollection()
您必须 init
项目
根据 apple 的 documentation。
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.
您必须使用
等项目进行初始化
var currentQueue: MPMediaItemCollection = MPMediaItemCollection(items:itemsArray)
我为您提供了一种非常简单的方法来获取任何类型的对象并从 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];
目前,我正在尝试制作一个音乐播放列表应用程序。我尝试从 NSUserDefaults 保存和检索播放列表数据。我在保存数据时没有问题,但在检索数据时出现错误。
我得到了:
Terminating app due to uncaught exception 'MPMediaItemCollectionInitException', reason: '-init is not supported, use -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!!!!!!!!!!!!")
}
}
我该如何解决?
这里是问题var currentQueue: MPMediaItemCollection = MPMediaItemCollection()
您必须 init
项目
根据 apple 的 documentation。
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.
您必须使用
等项目进行初始化var currentQueue: MPMediaItemCollection = MPMediaItemCollection(items:itemsArray)
我为您提供了一种非常简单的方法来获取任何类型的对象并从 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];