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

Posted

技术标签:

【中文标题】混合新旧数据时应用程序崩溃【英文标题】:App crashes when mixing up new and old data 【发布时间】:2011-03-10 15:05:38 【问题描述】:

我提出了一个与此有点相似的问题,虽然旧问题实际上得到了解决,但我发现了一个与此相关的新问题。无论如何,我选择了单独的主题。

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

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

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

发生的情况是,我的视图有一个子视图,它有一个页面控制器。每个页面都包含一个表格视图,数据被加载到其中。

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

谁能帮我解决这个问题?似乎应用程序在保存数据之前就开始加载数据了。

这是一些代码。请说,如果更多代码会有所帮助。我不知道如何解决这个问题。

这是来自 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];

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于混合新旧数据时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

为 Android 构建的混合应用程序在向输入框中输入数字时崩溃

NativeScript 混合移动应用程序:跟踪/捕获崩溃

应用程序仅与(lldb)崩溃?

我的录音机 SwiftUI/Storyboard 应用程序在加载时不断崩溃

运行带有 exrm 崩溃的 Phoenix 应用程序版本

使用 IBM MobileFirst Platform v7.1(包括 Dojo Toolkit SDK 1.10.3)开发的混合移动应用程序在升级到 iOS 10.3 后崩溃