我看到NSUserDefaults
不允许Array
,Dictionary
,String
,NSData
,NSNumber
,{以外的对象{1}},Bool
。但
NSDate
允许其他对象也存储,会出现什么问题。Apple
代替CoreData
,该怎么办?我知道NSUserDefaults
是全球可用的。正如@Hoa建议的那样,之前我忘了提及NSUserDefaults
选项
NSCoding
方法对所有属性进行编码和解码吗?答案 0 :(得分:3)
只要符合NSCoding协议,您就可以将任何对象保存到plist文件中。
您可以使用与此类似的代码:
+(id) readObjectFromFile:(NSString*) sFileName
{
return [NSKeyedUnarchiver unarchiveObjectWithFile:sFileName];
}
+(bool) saveObject:(id <NSCoding>) anObject ToFile:(NSString*) sFileName
{
NSData * data = [NSKeyedArchiver archivedDataWithRootObject:anObject];
NSError * error;
[data writeToFile:sFileName options:NSDataWritingAtomic error:&error];
if (error)
{
NSLog(@"Save Cats Data error: %@", error.description);
return NO;
}
return YES;
}
Swift版本:
func readObjectFromFile(sFileName: String) -> AnyObject {
return NSKeyedUnarchiver.unarchiveObjectWithFile(sFileName)
}
func saveObject(anObject: AnyObject, ToFile sFileName: String) -> Bool {
var data: NSData = NSKeyedArchiver.archivedDataWithRootObject(anObject)
var error: NSError
data.writeToFile(sFileName, options: NSDataWritingAtomic, error: error)
if error != nil {
print("Save Cats Data error: \(error.description)")
return false
}
return true
}
要了解有关NSCoding协议的更多信息,您可以阅读: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSCoding_Protocol/
答案 1 :(得分:0)
NSUserDefaults背后的意图是保存与应用程序状态相关的上下文数据,例如保存用户的首选项,当用户停止使用它时应用程序的状态(这样你可以在它启动时返回到该状态),登录会话数据等。
核心数据是一种更适合存储持久数据的方法,您可以根据需要映射数据模型,并提供更多种选项来保存数据类型。
虽然NSUserDefaults“无处不在”,但这不应成为决定这是否是保存数据的更好选择的转折点。
您可以编写一个用作数据提供程序的单例类,以便您可以像访问NSUserDefaults共享实例一样访问数据。你只需要记住,这个类或模块应该只做一件事,作为你的模型和你的实现之间的接口,所以你不要在这个类中存储任何对象,只需用它来传递请求来获取并将数据保存到CoreData。
这个类看起来像这样:
class CoreDataProvider {
static let sharedInstance = SUProvider()
let managedObjectContext : NSManagedObjectContext
let sortDescriptor: NSSortDescriptor
let fetchRequest: NSFetchRequest
private init(){
managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
fetchRequest = NSFetchRequest(entityName: "MyObject")
sortDescriptor = NSSortDescriptor (key:"objectAttribute", ascending:true)
self.fetchRequest.sortDescriptors = [self.sortDescriptor]
}
func getSavedObjects() -> [MyObject]? {
fetchRequest.sortDescriptors = [sortDescriptor]
do {
return try self.managedObjectContext.executeFetchRequest(fetchRequest) as? [MyObject]
} catch {
print("no records found")
}
}
}
您可以这样使用:
func getAllRecords() {
let records = CoreDataProvider.sharedInstance.getSavedObjects()
//- Do whatever you need to do
}
答案 2 :(得分:0)
存储对象的临时方法是创建字典或数组的json字符串。我在一些低规模的应用程序中使用它。然后,您可以将这些字符串存储在NSUserDefault ..中,当您需要使用它时,您可以将其解压缩,并且您可以使用自动将json数据映射到对象类型的Object Mapper库。
例如,您可以在类扩展中创建一个函数,在您需要时随时将json数据解析为对象。我建议仅将上述方法用于小规模应用。如果你想要高流量/大规模的应用程序,你可能想看看核心数据甚至SQlite3 ..
随意提出任何问题