2013-12-11 3 views
0

Я делаю простое 3-уровневое приложение с табличным просмотром на 1-м и 2-м уровнях.Добавить новые данные в приложение после обновления приложения

Имена строк в контроллерах tableviews сохраняются в массивах в файле plist. Когда пользователь переупорядочивает строки, я просто сохраняю новый порядок как новый массив в объекте NSUserdDefaults. И каждый раз, когда я загружаю контроллер Tableview, я проверяю, пустой объект NSUserdDefaults или нет. Если он не пуст, я беру порядок строк из массива в NSUserdDefaults, в противном случае - из файла plist.

Ниже приведен пример кода для первого уровня Tableview контроллера

- (void)viewDidLoad { 

[super viewDidLoad]; 
self.title = @"Topics"; 

// Checking User changes 
NSMutableArray* sectionList = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"section"]]; 

if ([sectionList count] != 0) { 
    self.sections = [[NSMutableArray alloc] initWithArray:sectionList copyItems:YES];} 
else { 
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"myFile" ofType:@"plist"]; 
    self.sections = [NSMutableArray arrayWithContentsOfFile:filePath];} 


- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath{ 

NSString *item = [self.sections objectAtIndex:fromIndexPath.row]; 
[self.sections removeObject:item]; 
[self.sections insertObject:item atIndex:toIndexPath.row]; 
[[NSUserDefaults standardUserDefaults] setObject:self.sections forKey:@"section"];} 

Проблема в том об обновлении. Если я добавлю новые данные (новые строки) в файл plist и приложение для обновления, пользователь не увидит новые строки в контроллере tableview, потому что его объект NSUserdDefaults не пуст, а имена и порядок строк будут загружены из этого объекта. Я думал об очистке объектов NSUserdDefaults, но я не мог найти, как это сделать сразу после обновления и больше времени.

У вас есть идеи, как с этим бороться?

Любая помощь очень ценится

ответ

1

Вы можете apporach это так:

  1. Внутри NSUserDefaults сохранить номер версии - который будет всегда расслоением версия.
  2. При загрузке приложения проверьте, что версия ниже текущей версии пакета - обновите данные и обновите номер версии, чтобы расслоить версию, чтобы она выполнялась только один раз.
  3. Если вы добавили новые свойства, просто проверьте, находятся ли они уже в NSUSerDefaults - если нет - создайте их в логике преобразования.

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

============================

Дополнительные ответы на вопросы из комментариев:

1) что означает «пакетная версия»

NSString * version = [[[NSBundle mainBundle] infoDictionary] objectForKey: @ "CFBundleVersion"];

Это версия приложения - вам нужно увеличить ее каждый раз, когда вы нажимаете приложение в Apple Store. Вы можете сделать это в настройках проекта xcode.

2) как я могу проверить, что произошло обновление - я имею в виду, как я знаю, что мне нужно увеличить номер версии.

Вы не можете самостоятельно определить процесс обновления и отреагировать на него. Вы должны проверить это при запуске вашего приложения. Когда ваше приложение запускается, прежде чем показывать что-либо пользователю, проверьте «версию» из пакета (как ответ выше) на все, что у вас есть в [NSUserDefaults]. Если он отличается от того, что вы знаете, что приложение было обновлено, и у вас есть новая версия приложения, работающая со старой версией данных. Исходя из этого, вы можете реагировать и обновлять свои данные + обновлять версию до текущей версии сборки.

3) «новые свойства» - вы имеете в виду дополнительные данные, которые будут сохранены в NSUserDefaults, но ранее не были сохранены? Например, в версии 2 я начну сохранять количество строк и пользователя, который не обновлен до версии 2, но обновления версии 3 не будут иметь этот объект. Поэтому мне нужно проверить, существуют ли все объекты NSUserDefaults, а если нет - создать их. правильно?

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

+0

Спасибо! Я понял логику, могу ли я задать некоторые дополнительные вопросы (я новичок в iOS): – user2498776

+0

Конечно, напишите мне строку или разместите их в отдельном вопросе, если они больше. –

+0

Спасибо. 1) что это означает «пакетная версия» 2) как я могу проверить, произошло ли обновление? Я имею в виду, как я знаю, что мне нужно увеличить номер версии. 3) «новые свойства» - вы имеете в виду дополнительные данные, которые будут сохранены в NSUserDefaults, но ранее не были сохранены? Например, в версии 2 я начну сохранять количество строк и пользователя, который не обновлен до версии 2, но обновления версии 3 не будут иметь этот объект. Поэтому мне нужно проверить, существуют ли все объекты NSUserDefaults, а если нет - создать их. правильно? – user2498776

Смежные вопросы