2011-03-10 91 views
0

我已经提出了一个类似于这个问题的问题,虽然旧问题实际上已经解决了,但是我发现了一个涉及了一点的新问题。无论如何,我选择了分开的话题。当新旧数据混淆时应用程序崩溃

我有一个应用程序从我的web服务器上的属性列表读取数据。我希望应用程序在离线时可用,因此我将属性列表作为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]; 

是否有可能从应用程序委托调用表视图实现中的方法,并告诉它填充表?所以它正在等待下载完成?

回答

0

我通过发送通知到NSNotificationCenter并添加一个观察者到表视图,它将等待通知,然后在表上呼叫reloadData解决此问题。

相关问题