繁体   English   中英

仅当通过Testflight安装时,应用程序才会解析JSON解析

[英]App crashes parsing JSON only when installed via Testflight

因此,我的应用程序首先通过解析json文件(包含在项目中)中的所有信息开始运行,然后将其保存到其核心数据模型中。

通过使用XCode进行调试部署,这可以很好地运行,但是当我通过Testflight安装应用程序时,它立即崩溃。

我已经确定它是解析json文件的问题,因为我创建了一个不执行此操作的构建,而是直接从Web API获取数据,唯一的问题是从Web API获得从json文件下载所有数据大约需要一个小时,大约需要一分钟。

我尝试禁用BITCODE并确保将方案设置为Release,这似乎涵盖了通过Testflight进行的大多数启动问题。 两者都没有起作用。

我怀疑是通过Testflight分发时json文件没有与应用正确打包,但是我不知道如何解决这个问题。 有没有人有什么建议?

我将导入功能包括在下面,以防错误包含在其中,而不是配置中。

json文件大约为26mb,与项目中的其他大多数文件相比非常大。

我的设备是运行iOS 11.2.6和XCode 9.2的iPhone X,该应用程序还可以在所有模拟器上成功运行。 我正在使用Objective C

-(void)ImportInitialCards:(NSManagedObjectContext *) managedObjectContext
{
    _privateManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

    // Configure Managed Object Context
    [_privateManagedObjectContext setParentContext:managedObjectContext];

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"cardDatabase1" ofType:@"json"];

    NSInputStream *inputStream = [[NSInputStream alloc] initWithFileAtPath:filePath];
    [inputStream open];

    NSArray *cards = [NSJSONSerialization JSONObjectWithStream:inputStream options:kNilOptions error:nil];

    float percentage = 1.0 / (float) cards.count;

    for (NSDictionary *card in cards)
    {
        NSString *cardParticularsJson = [card valueForKey:@"cardContent"];

        NSData *cardParticularsData = [cardParticularsJson dataUsingEncoding:NSUTF8StringEncoding];
        NSDictionary *cardParticulars = [NSJSONSerialization JSONObjectWithData:cardParticularsData options:NSJSONReadingMutableContainers error:nil];

        NSString *cardName = [cardParticulars valueForKey:@"name"];
        NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Card"];
        [request setPredicate:[NSPredicate predicateWithFormat:@"name == %@", cardName]];

        NSError *error = nil;
        NSUInteger count = [_privateManagedObjectContext countForFetchRequest:request error:&error];

        if (count > 0)
        {
            NSLog(@"CardMatched: %@", cardName);
            //card matched
            _progress += percentage;
            _currentProgressDescription = @"Scanning ...";
        }
        else
        {
            _currentProgressDescription = [NSString stringWithFormat:@"Importing: %@", cardName];

            NSManagedObject *newCard = [NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:_privateManagedObjectContext];
            [self SaveCardFrom:cardParticulars to:newCard saveThumb:NO inContext:_privateManagedObjectContext];

            _progress += percentage;
            dispatch_async(dispatch_get_main_queue(),^ {
                NSError *error = nil;
                [managedObjectContext save:&error];
            } );
        }
    }
}

我决定发布解决问题的方法,希望它可以帮助像我这样挣扎的其他人。 因此,在导入JSON文件时,我正在更新进度条以指示将花费多长时间,这是在while循环中,这使CPU占用了最大的时间,与JSON导入一起将CPU占用了大约200%的时间,这导致了应用关闭。

解决方案似乎真的很明显,不要让CPU超过100%

我现在计划仅在更改值时才更新进度条,而不是通过while循环不断更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM