Сбой приложения при попытке загрузить большое количество данных в мое приложение

Я пытаюсь загрузить JSON из 40 000+ записей в свой Realm Database. Вот моя функция

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];

Все работает нормально на 10 000 объектов. Но когда я иду к 40 000, я получаю эту ошибку:

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

Кто-нибудь может мне помочь, пожалуйста! Заранее спасибо !!

ИЗМЕНИТЬ

Он падает перед журналом «COUNT SI». Так что я думаю, что это как-то связано с AFNetworking? Также я заметил, что он не вылетает на симуляторе...


person Steaphann    schedule 03.12.2014    source источник
comment
Уууууу - не делай этого. Добавьте пагинацию, используйте CoreData. Не загружайте этот объем данных сразу — это очень долго   -  person Grzegorz Krukowski    schedule 03.12.2014
comment
Откуда берутся данные? Очень вероятно, что когда вы запрашиваете такой объем данных, сервер тратит так много времени на построение ответа, что время ожидания соединения истекает. В похожей ситуации мне пришлось встроить эвристику для настройки размера запросов, если время ожидания соединения истекло.   -  person Hot Licks    schedule 03.12.2014
comment
Гжегож Круковски прав в том, что не стоит загружать сразу столько данных в память, но я не вижу смысла использовать для этого Core Data over Realm. На самом деле Realm будет использовать меньше памяти после вставки данных. Синтаксический анализ JSON занимает чрезвычайно большой объем памяти.   -  person jpsim    schedule 03.12.2014
comment
Привет Стеф! Вы придумали какое-нибудь решение? У меня такая же проблема, но с меньшим количеством записей.   -  person Krunal    schedule 12.12.2014
comment
@Goti На данный момент я отказался от использования данных Core и теперь использую Realm (www.realm.io) намного быстрее !!!   -  person Steaphann    schedule 07.01.2015
comment
@StefGeelen У меня также есть решение, имеющее NSMutableString вместо NSString. Простое добавление строки в объект NSMutableString очищает мой путь. Спасибо кстати.   -  person Krunal    schedule 08.01.2015


Ответы (2)


Эта проблема не связана с Realm.

Я пытаюсь загрузить JSON из 40 000+ записей.

Вот твоя проблема. AFJSONRequestOperation попытается десериализовать JSON в памяти, и у вашего приложения больше не будет доступной памяти, и оно будет завершено.

Также я заметил, что он не вылетает на симуляторе...

Это связано с тем, что симулятор имеет доступ к гораздо большему объему памяти, чем устройство iOS.

Вы должны найти способы уменьшить размер ваших сетевых запросов, либо запрашивая меньше данных за раз, либо используя менее расточительный формат ответа, чем строки JSON.

person jpsim    schedule 03.12.2014
comment
Ладно, теперь я буду работать с пейджингом в своих JSON! Спасибо за помощь ! - person Steaphann; 04.12.2014

Оберните тело цикла в @autoreleasepool

Также дублирование одного и того же JSON дважды кажется излишним.

person Ben Affleck    schedule 03.12.2014