Bra*_*cal 4 cocoa-touch cocos2d-iphone iphone-sdk-3.0 ios
我有一堆与级别相关的misc数据,这样我需要保存,即使玩家关闭/打开手机,重启设备,退出游戏等也会保存.基本上是持久数据.我已经查看了很多我的选择,但没有找到一个简单明了的方法来满足我的需求,并且希望有人能够帮助我,并给出一个明确的例子,说明如何为我的需求实现最佳方法的基础.
我查看了下面的NSUSerDefaults(显然不是最好的,因为它是偏好的,所以我理解)NSCoder/NSKeyedArchiver(无法想出一个明确的方法来保存所有数据保存的1个单一类的简单数据类型在作为属性)SQLite3(完全丢失)
任何帮助和方向将不胜感激.
我需要在整个程序中保存和轻松访问的数据类型是...... NSStrings,NSArrays,Ints,Bools.
感谢您的帮助,我希望得到一个明确的答案!
保存到NSUserDefaults当然没有任何问题,但如果你想将你的属性保存到磁盘,我会为你保存一些代码,以便保存到.plist文件,然后再检索它.你也可以在这个要点中找到它.
// We're going to save the data to SavedState.plist in our app's documents directory
NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *plistPath = [rootPath stringByAppendingPathComponent:@"SavedState.plist"];
// Create a dictionary to store all your data
NSMutableDictionary *dataToSave = [NSMutableDictionary dictionary];
// Store any NSData, NSString, NSArray, NSDictionary, NSDate, and NSNumber directly. See "NSPropertyListSerialization Class Reference" for more information.
NSString *myString = @"Hello!"
[dataToSave setObject:myString forKey:@"MyString"];
// Wrap primitives in NSValue or NSNumber objects. Here are some examples:
BOOL someBool = YES;
NSNumber *boolValue = [NSNumber numberWithBool:someBool];
[dataToSave setObject:boolValue forKey:@"SomeBoolValue"];
int someInteger = 99;
NSInteger *integerValue = [NSNumber numberWithInteger:someInteger];
[dataToSave setObject:integerValue forKey:@"SomeIntegerValue"];
// Any objects that conform to NSCoding can be archived to an NSData instance. In this example, MyClass conforms to NSCoding.
MyClass *someObject = [[MyClass alloc] init];
NSData *archivedStateOfSomeObject = [NSKeyedArchiver archivedDataWithRootObject:someObject];
[dataToSave setObject:archivedStateOfSomeObject forKey:@"SomeObject"];
// Create a serialized NSData instance, which can be written to a plist, from the data we've been storing in our NSMutableDictionary
NSString *errorDescription;
NSData *serializedData = [NSPropertyListSerialization dataFromPropertyList:dataToSave
format:NSPropertyListXMLFormat_v1_0
errorDescription:&errorDescription];
if(serializedData)
{
// Write file
NSError *error;
BOOL didWrite = [serializedData writeToFile:plistPath options:NSDataWritingFileProtectionComplete error:&error];
NSLog(@"Error while writing: %@", [error description]);
if (didWrite)
NSLog(@"File did write");
else
NSLog(@"File write failed");
}
else
{
NSLog(@"Error in creating state data dictionary: %@", errorDescription);
}
Run Code Online (Sandbox Code Playgroud)
// Fetch NSDictionary containing possible saved state
NSString *errorDesc = nil;
NSPropertyListFormat format;
NSString *plistPath;
NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES) objectAtIndex:0];
plistPath = [rootPath stringByAppendingPathComponent:@"SavedState.plist"];
NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
NSDictionary *unarchivedData = (NSDictionary *)[NSPropertyListSerialization
propertyListFromData:plistXML
mutabilityOption:NSPropertyListMutableContainersAndLeaves
format:&format
errorDescription:&errorDesc];
// If NSDictionary exists, look to see if it holds a saved game state
if (!unarchivedData)
{
NSLog(@"Error reading plist: %@, format: %d", errorDesc, format);
}
else
{
// Load property list objects directly
NSString *myString = [unarchivedData objectForKey:@"MyString"];
// Load primitives
NSNumber *boolValue = [unarchivedData objectForKey:@"SomeBoolValue"];
BOOL someBool = [boolValue boolValue];
NSNumber *integerValue = [unarchivedData objectForKey:@"SomeIntegerValue"];
BOOL someBool = [integerValue integerValue];
// Load your custom objects that conform to NSCoding
NSData *someObjectData = [unarchivedData objectForKey:@"SomeObject"];
MyClass *someObject = [NSKeyedUnarchiver unarchiveObjectWithData:someObjectData];
}
Run Code Online (Sandbox Code Playgroud)
有关进一步阅读,请查看" 存档和序列化编程指南".
| 归档时间: |
|
| 查看次数: |
4519 次 |
| 最近记录: |