App crash when trying to load a large amount off data into my app

自古美人都是妖i 提交于 2019-12-04 04:18:02

问题


I am trying to load a JSON of 40 000+ records into my Realm Database. Here is my function

AFJSONRequestOperation *operation = [[AFJSONRequestOperation alloc]init];
[AFJSONRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@"text/html"]];

operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

    NSArray *relations = [JSON copy];
    NSLog(@"COUNT SI %d",relations.count);

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSArray *relations = [JSON copy];
        RLMRealm *realm = [RLMRealm defaultRealm];
        [realm beginWriteTransaction];

        for (NSDictionary *dict in relations) {
            Relation *relation = [[Relation alloc]init];

            relation.rel_address = [NSString stringWithFormat:@"%@",[dict valueForKey:@"Address"]];
            relation.rel_balanceTotal = [[dict valueForKey:@"BalanceTotal"]doubleValue];
            relation.rel_bank_country_code = [NSString stringWithFormat:@"%@",[dict valueForKey:@"BankCountryCode"]];
            relation.rel_bank_number = [NSString stringWithFormat:@"%@",[dict valueForKey:@"BankNumber"]];
            relation.rel_city = [NSString stringWithFormat:@"%@",[dict valueForKey:@"City"]];
            relation.rel_city_id = [[dict valueForKey:@"CityId"]intValue];
            relation.rel_code = [NSString stringWithFormat:@"%@",[dict valueForKey:@"Code"]];
            relation.rel_country = [NSString stringWithFormat:@"%@",[dict valueForKey:@"Country"]];
            relation.rel_country_code = [NSString stringWithFormat:@"%@",[dict valueForKey:@"CountryCode"]];
            relation.rel_customerProspect = [NSString stringWithFormat:@"%@",[dict valueForKey:@"CustomerProspect"]];
            relation.rel_customerCode = [NSString stringWithFormat:@"%@",[dict valueForKey:@"CustomerProspectCode"]];
            relation.rel_email = [NSString stringWithFormat:@"%@",[dict valueForKey:@"Email"]];
            relation.rel_expired_total = [[dict valueForKey:@"ExpiredTotal"]doubleValue];
            relation.rel_fax = [NSString stringWithFormat:@"%@",[dict valueForKey:@"Fax"]];
            relation.rel_gsm = [NSString stringWithFormat:@"%@",[dict valueForKey:@"GSM"]];
            relation.rel_latitude = [[dict valueForKey:@"Latitude"]doubleValue];
            relation.rel_longitude = [[dict valueForKey:@"Longitude"]doubleValue];
            relation.rel_memo = [NSString stringWithFormat:@"%@",[dict valueForKey:@"Memo"]];
            relation.rel_name = [NSString stringWithFormat:@"%@",[dict valueForKey:@"Name"]];
            relation.rel_phone = [NSString stringWithFormat:@"%@",[dict valueForKey:@"Phone"]];
            relation.rel_turnovertotal = [[dict valueForKey:@"TurnoverTotal"]doubleValue];
            relation.rel_vat_country_code = [NSString stringWithFormat:@"%@",[dict valueForKey:@"VATCountryCode"]];
            relation.rel_vat_number = [NSString stringWithFormat:@"%@",[dict valueForKey:@"VATNumber"]];
            relation.rel_website = [NSString stringWithFormat:@"%@",[dict valueForKey:@"Website"]];
            relation.rel_zipcode = [NSString stringWithFormat:@"%@",[dict valueForKey:@"ZipCode"]];
            [realm addObject:relation];
        }
        [realm commitWriteTransaction];
        compblock(YES);

    });


} failure:^( NSURLRequest *request ,NSHTTPURLResponse *response ,NSError *error , id JSON ){
    NSLog(@"error is %@",error);
}];
[operation start];

Everything works oké for 10 000 objects. But when I go to 40 000, I get this error:

Communications error: <OS_xpc_error: <error: 0x356dc614> { count = 1, contents =
    "XPCErrorDescription" => <string: 0x356dc86c> { length = 22, contents = "Connection interrupted" }
}>

Can anyone please help me? Thanks in advance !!

EDIT

It crashes before the "COUNT SI" log. So I think it has something to do with AFNetworking? Also I noticed that it does not crashed on simulator...


回答1:


This problem is unrelated to Realm.

I am trying to load a JSON of 40 000+ records

There's your problem. AFJSONRequestOperation will attempt to deserialize the JSON in memory and your app will no longer have any available memory, and will get terminated.

Also I noticed that it does not crashed on simulator...

This is because the simulator has access to much more memory than an iOS device.

You should find ways to reduce the size of your network requests, either by requesting less data at a time or using a less wasteful response format than JSON strings.




回答2:


Wrap loop's body in @autoreleasepool

Also copying the same JSON twice seems redundant.



来源:https://stackoverflow.com/questions/27276718/app-crash-when-trying-to-load-a-large-amount-off-data-into-my-app

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!