Приложение вылетает при смешивании новых и старых данных - PullRequest
0 голосов
/ 10 марта 2011

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

У меня есть приложение, которое считывает данные из списка свойств на моем веб-сервере.Я хочу, чтобы приложение работало в автономном режиме, поэтому я копирую список свойств на iPhone в виде Bands.plist и считываю данные из локального списка.

Моя проблема в том, что если данные были обновлены истарая версия Bands.plist хранится на устройстве, затем мое приложение начинает чтение из Bands.plist во время обновления, и данные становятся смесью старых и новых данных, что приводит к сбою приложения.Я не могу понять, как решить эту проблему, и надеюсь, что у кого-то есть идея.

У меня есть изображение, которое иллюстрирует мою проблему:

On the left is the old data and on the right is the new data

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

Здесь вы видите, что я перемещаюсь из одного представления в другое.В первом представлении (слева) отображаются старые данные, а во втором представлении (справа) - новые данные.В этом переходе взглядов приложение вылетает.

Может кто-нибудь помочь мне понять это?Кажется, что приложение начинает загружать данные перед их сохранением.

Вот некоторый код.Пожалуйста, скажите, если больше кода поможет.Я не могу понять, как решить эту проблему.

Это от делегата приложения.Здесь данные извлекаются с веб-сервера и сохраняются в Bands.plist.

NSLog(@"[AppDelegate] Data has been downloaded.");

    // throw data into a property list (plist)
    NSMutableArray *tmpArray = [NSPropertyListSerialization propertyListFromData:receivedData mutabilityOption:NSPropertyListMutableContainers format:nil errorDescription:nil];

    NSMutableArray *plistArray = [[NSMutableArray alloc] initWithArray:tmpArray];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Bands.plist"];

    NSLog(@"[AppDelegate] Bands.plist has been populated.");

Это из табличного представления.Здесь данные загружаются из Bands.plist.

    pageNumber = page;

            NSLog(@"[TableView] Loading view.");

            NSArray *whatDays = [[NSArray alloc] initWithObjects:@"Onsdag", @"Torsdag", @"Fredag", @"Lørdag", @"Ikke programsat", nil];

            sections = [[NSMutableDictionary alloc] init];

            NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
            NSString *documentsDirectory = [paths objectAtIndex:0];
            NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Bands.plist"];
            tmpArray = [[NSMutableArray alloc] initWithContentsOfFile:path];

            // scan through data and sort
            for(int i = 0; i < [whatDays count]; i++) {
                NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.weekDay == %@", [whatDays objectAtIndex:i]];
                NSArray *bandsThisDay = [tmpArray filteredArrayUsingPredicate:predicate];
                [sections setObject:bandsThisDay forKey:[whatDays objectAtIndex:i]];
            }

            [whatDays release];

Можно ли вызвать метод в реализации табличного представления из делегата приложения и сказать ему заполнить таблицу?Значит, она ждет загрузки?

1 Ответ

0 голосов
/ 21 марта 2011

Я решил эту проблему, отправив уведомление на NSNotificationCenter и добавил наблюдателя в табличное представление, которое будет ждать уведомления, а затем вызовет reloadData для таблицы.

...