Добавить в избранное Функциональность - PullRequest
0 голосов
/ 14 мая 2011

У меня возникли проблемы с работой функции добавления в избранное. Вот код, который я использую для настройки массива и словаря для данных избранного:

В делегате приложения в "appDidFinishLaunching":

delegateFavouritesDictionary = [NSMutableDictionary dictionary];

NSLog(@"Mutable Dictionary: %@", delegateFavouritesDictionary);

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Saved.data"];

[delegateFavouritesDictionary writeToFile:filePath atomically: YES];

delegateFavouritesArray = [[NSMutableArray alloc] init];

Тогда в моем detailViewController у меня есть функция addToFavourites:

if([[addToFavouritesDictionary allKeys] containsObject:ID]) {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Saved.data"];

    [addToFavouritesDictionary removeObjectForKey:ID];
    [addToFavouritesArray removeObject:Name];
    [favouritesButton setTitle:@"+ Favourites" forState:(UIControlState)UIControlStateNormal];
    [addToFavouritesDictionary writeToFile:filePath atomically: YES];
    NSLog(@"New Dictionary: %@", addToFavouritesDictionary);

} else {

    [addToFavouritesArray addObject:Name];
    NSString *ID = [[NSUserDefaults standardUserDefaults]objectForKey:@"ID"];
    [addToFavouritesDictionary setObject:Name forKey:ID];
    [favouritesButton setTitle:@"- Favourites" forState:(UIControlState)UIControlStateNormal];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Saved.data"];

    [addToFavouritesDictionary writeToFile:filePath atomically: YES];
    NSLog(@"Mutable Dictionary: %@", addToFavouritesDictionary);
    //[addToFavouritesDictionary release];
}

Приведенный выше код работает, как и ожидалось, при запуске приложения он устанавливает словарь и загружает содержимое словаря «Saved.data» в словарь, затем в detailViewController загружает файл «Saved.data» и добавляет или удаляет в этот файл. У меня проблема в том, что когда iPhone перезагружается, все данные избранного исчезают, или если приложение вылетает, а затем снова открывается, все данные из избранного исчезают. Есть ли способ сохранить данные без удаления при каждом перезапуске или выключении устройства?

Большое спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 14 мая 2011

Кажется, что вы перезаписывали свои любимые файлы при каждом запуске приложения, в appDidFinishLaunching вы создаете новый словарь и сохраняете его в сохраненные данные. Теперь, если вы прочитаете его в detailViewController, вы получите новый пустой словарь.

Это объясняет, почему вы используете свои данные, если iPhone перезагружается, поскольку при выключении и включении устройства ваши файлы, сохраненные в каталоге «Документы», не удаляются.Этот каталог существует для того, чтобы вы могли сохранять свои данные и хранить их безопасно между перезапусками, в противном случае это не имело бы никакого смысла, и тогда его следует называть «tmp», которого нет.

EDIT

Предложение: загружайте его только один раз в appDidFinishLoading, сохраняйте при каждом изменении или просто выходя из приложения (applicationDidEnterBackground и / или applicationWillTerminate - первое, если вы поддерживаете многозадачность, и второе в противном случае), и с вами все должно быть.

РЕДАКТИРОВАТЬ

Я использую NSKeyedArchiver и NSKeyedUnarchiver, поэтому сохраняйте данные:

[NSKeyedArchiver archiveRootObject: d toFile: filePath];

, а затем восстанавливайте:

NSMutableDictionary *d = [NSKeyedUnarchiver unarchiveObjectWithFile: filePath];
if (d == nil) {
    d = [[NSMutableDictionary alloc] init];
}

Вы также можете попробовать это: + (id)dictionaryWithContentsOfFile:(NSString *)path класса NSDictionary, чтобы получить словарь из файла:

delegateFavouritesDictionary = [NSMutableDictionary dictionaryWithContentsOfFile: filePath];
if (delegateFavouritesDictionary == nil) {
    delegateFavouritesDictionary = [[NSMutableDictionary alloc] init];
}

, поскольку вы видите, что вам не нужно проверять, существует ли файл, так как в случае любой ошибки вы получите nil, в этом случае вы создадите пустой экземпляр.

0 голосов
/ 14 мая 2011

почему бы не сохранить его в пользовательских настройках?

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:yourobject forKey:@"yourkey"];

Или в SQLite ...

...