Как использовать pList в iOS-программировании

Недавно я старшеклассник, и я заинтересован в создании приложений для iPhone. Недавно появилось одно из моих приложений: NBlock. Это приложение для головоломки, и это очень сложно. Однако у него есть несколько проблем. Высокие баллы не сохраняются. Мне сказали использовать plist. Любые советы?

Ответы

Ответ 1

Метод, основанный на URL-адресе для этого:

// Get the URL for the document directory
NSFileManager *fileManager = [[NSFileManager alloc] init];
NSURL *documentDirectoryURL = [[fileManager URLsForDocumentDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] objectAtIndex:0];

// Turn the filename into a string safe for use in a URL
NSString *safeString = [@"scores.plist" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

// Create an array for the score
NSMutableArray *array = [[NSMutableArray alloc] init];      
[array addObject:[NSNumber numberWithInt:score]];

// Write this array to a URL
NSURL *arrayURL = [NSURL URLWithString:safeString relativeToURL:documentDirectoryURL];
[array writeToURL:arrayURL atomically:YES];

Ответ 2

Я бы избегал использовать plist. Самый простой способ сохранить простые данные в приложении, на самом деле, NSUserDefaults.

Ознакомьтесь с этот учебник для простого руководства по использованию NSUserDefaults. Всегда выполняйте synchronize NSUserDefaults, когда вы закончите писать им.

Если вы ищете более мощный (но более сложный) способ сохранения данных, посмотрите руководство Apple на использование Core Data.

Ответ 3

Вот что вы хотите:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"scores.plist"];
NSMutableArray *array = [[NSMutableArray alloc] init];      
[array addObject:[NSNumber numberWithInt:score]];        
[array writeToFile:path atomically:YES];

И чтобы добавить новые оценки, сделайте initWithContentsOfFile:@"scores.plist" вместо init в объявлении array. Вы можете дополнительно использовать NSUserDefaults.

Ответ 4

Взгляните на NSKeyedArchiver/Unarchiver. Вы можете сэкономить все, что захотите; NSUserDefaults, по моему опыту, сбрасывает ваши данные, если вы убиваете приложение из лотка. Основные данные действительно используются лучше, если вы управляете большими объемами данных с такими базами данных, как sqlite.

Ответ 5

Я бы сказал, что приведенный ниже код будет работать и довольно прямолинейно, если не будут использоваться типы данных пользовательских объектов (его другая история):

NSString* plistPath = nil;
NSFileManager* manager = [NSFileManager defaultManager];
 if ((plistPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"PathTo.plist"])) 
   {
    if ([manager isWritableFileAtPath:plistPath]) 
     {
       NSMutableDictionary* infoDict = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath];
      [infoDict setObject:@"foo object" forKey:@"fookey"];
      [infoDict writeToFile:plistPath atomically:NO];
      [manager setAttributes:[NSDictionary dictionaryWithObject:[NSDate date] forKey:NSFileModificationDate] ofItemAtPath:[[NSBundle mainBundle] bundlePath] error:nil];
     }
   }

установка атрибута даты может быть полезна для проверки того, когда последний балл был обновлен.