混合新旧数据时应用程序崩溃

时间:2011-03-10 15:05:39

标签: iphone sdk load save plist

我提出了一个与此类似的问题,虽然旧问题实际上已经解决但我发现了一个与之相关的新问题。无论如何,我选择制作单独的主题。

我有一个应用程序,它从我的网络服务器上的属性列表中读取数据。我希望应用程序在离线时可用,因此我将属性列表作为Bands.plist复制到iPhone上,然后我从本地plist中读取数据。

我的问题是,如果数据已经更新并且旧版本的Bands.plist存储在设备上,那么我的应用程序在更新时开始从Bands.plist读取数据,并且数据变成新旧数据的混合这导致应用程序崩溃。我无法弄清楚如何解决这个问题,并希望有人有一个想法。

我有一张图片说明了我的问题:

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

我的视图有一个带有页面控制器的子视图。每个页面都包含一个加载数据的表视图。

在这里你看到我从一个视图滑动到另一个视图。在第一个视图(左侧)是旧数据,在第二个视图(右侧)是新数据。在这种视图转换中,应用程序崩溃。

任何人都可以帮我解决这个问题吗?似乎应用程序在保存数据之前就开始加载数据。

这是一些代码。请说,如果更多代码会有所帮助。我无法弄清楚如何解决这个问题。

这是来自App Delegate。这里的数据是从网络服务器中检索出来的,并保存到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];

是否可以从app delegate调用tableview实现中的方法并告诉它填充表?那么它还在等待下载完成吗?

1 个答案:

答案 0 :(得分:0)

我通过向NSNotificationCenter发送通知并向表视图添加一个观察者来解决此问题,该观察者将等待通知,然后在桌面上调用reloadData