2013-08-01 4 views
15

Производительность RestKit неприемлемо медленна при загрузке всего лишь 9000 объектов - это займет 10 минут на симуляторе и на неопределенное время на iPad Mini.Производительность и основные данные RestKit

У меня есть несколько таблиц, которые я загружаю из спокойного интерфейса. Все это работает, но, похоже, проблема экспоненциального масштаба становится невыносимой, когда есть много объектов. В следующей таблице представлено больше всего проблем:

optionMapping.identificationAttributes = @[@"optionID"]; 

// OptionType 
RKEntityMapping *optionTypeMapping = [RKEntityMapping mappingForEntityForName:@"OptionType" inManagedObjectStore:rkMOS]; 
[optionTypeMapping addAttributeMappingsFromDictionary:@{ 
@"id" : @"optionTypeID", 
@"option_type" : @"optionType",}]; 

optionTypeMapping.identificationAttributes = @[@"optionTypeID"]; 

Атрибут optionTypeID индексируется в Core Data и не является обязательным.

Там приведены некоторые отношения к другим таблицам, которые я сопоставляются следующим образом:

// Option.optionType -> OptionType 

[optionMapping addConnectionForRelationship:@"optionType" connectedBy: @"optionTypeID"]; 

// Option.unit -> Unit 

[optionMapping addConnectionForRelationship:@"unit" connectedBy:@"unitID"]; 

Они, кажется, не будет проблемой - заметил я их, и загрузить все еще очень, очень медленно ,

Я создал дескриптор ответа (это каталог, поэтому мне нужно его скачать). Обратите внимание, что в следующем коде показана настройка для всех таблиц.

NSArray *reqA = @[@{@"endpoint" : API_VENDORS_ENDPOINT, 
        @"mapping" : vendorMapping}, 

        @{@"endpoint" : API_OPTION_TYPES_ENDPOINT, 
        @"mapping" : optionTypeMapping}, 

        @{@"endpoint" : API_OPTIONS_ENDPOINT, 
        @"mapping" : optionMapping}, 

        @{@"endpoint" : API_UNITS_ENDPOINT, 
        @"mapping" : unitMapping}, 

        @{@"endpoint" : API_PRICE_TIERS_ENDPOINT, 
        @"mapping" : priceTierMapping}, 

        @{@"endpoint" : API_PRODUCT_TYPES_ENDPOINT, 
        @"mapping" : productTypeMapping}, 

        @{@"endpoint" : API_PRODUCTS_ENDPOINT, 
        @"mapping" : productMapping} 
        ]; 

for (NSDictionary *mapD in reqA) { 

    RKResponseDescriptor *thisRD = [RKResponseDescriptor 
            responseDescriptorWithMapping:[mapD valueForKey:@"mapping"] 
            pathPattern:[mapD valueForKey:@"endpoint"] 
            keyPath:nil 
            statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 

    [_objMgr addResponseDescriptor:thisRD]; 

Я использую диспетчер объектов для загрузки таблицы:

выход
[_objMgr getObjectsAtPath:verbStr 
       parameters:nil 
       success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
        RKLogInfo(@"%@ load complete: %@", verbStr, [NSDate date]); 

        NSInteger idx = [loadA indexOfObject:verbStr] + 1; 

        if (idx < [loadA count]) { 
         [self load:[loadA objectAtIndex:idx] stack:loadA]; 
        } 

        [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:verbStr]; 
        [[NSUserDefaults standardUserDefaults] synchronize]; 

        NSDictionary *options = @{@"verb" : verbStr}; 
        [[NSNotificationCenter defaultCenter] postNotificationName:OBJECTS_DOWNLOADED object:self userInfo:options]; 

       } failure:^(RKObjectRequestOperation *operation, NSError *error) { 
        RKLogError(@"Load failed with error: %@", error); 

        NSInteger statusCode = operation.HTTPRequestOperation.response.statusCode; 

        if (401 == statusCode) { 
         [self resetAdmin]; 
        } 
       }]; 

консоль показывает, что отображение пыхтит, но она принимает навсегда. Ниже приведен только один фрагмент из тысяч таких:

2013-08-01 17:11:49.319 CarpetDirect[138:1507] D restkit.object_mapping:RKMappingOperation.m:952 Starting mapping operation... 
2013-08-01 17:11:49.321 CarpetDirect[138:1507] T restkit.object_mapping:RKMappingOperation.m:953 Performing mapping operation: <RKMappingOperation 0x1dda2160> for 'Option' object. Mapping values from object { 
    id = 1307; 
    "option_type" = 0; 
    unit = "<null>"; 
    value = "939 Puddle"; 
} to object <Option: 0x1dd55020> (entity: Option; id: 0x1dd55060 <x-coredata:///Option/t3ABD9C1C-1BBA-4C39-AEF7-EB3D1D9AFC0B1334> ; data: { 
    optionID = 1307; 
    optionType = nil; 
    optionTypeID = 0; 
    orderedItems =  (
); 
    products =  (
); 
    unit = nil; 
    unitID = 0; 
    value = nil; 
}) with object mapping (null) 
2013-08-01 17:11:49.324 CarpetDirect[138:1507] T restkit.object_mapping:RKMappingOperation.m:550 Mapping attribute value keyPath 'id' to 'optionID' 
2013-08-01 17:11:49.326 CarpetDirect[138:1507] T restkit.object_mapping:RKMappingOperation.m:583 Skipped mapping of attribute value from keyPath 'id to keyPath 'optionID' -- value is unchanged (1307) 
2013-08-01 17:11:49.329 CarpetDirect[138:1507] T restkit.object_mapping:RKMappingOperation.m:550 Mapping attribute value keyPath 'unit' to 'unitID' 
2013-08-01 17:11:49.333 CarpetDirect[138:1507] T restkit.object_mapping:RKMappingOperation.m:431 Found transformable value at keyPath 'unit'. Transforming from type 'NSNull' to 'NSNumber' 
2013-08-01 17:11:49.334 CarpetDirect[138:1507] T restkit.object_mapping:RKMappingOperation.m:572 Mapped attribute value from keyPath 'unit' to 'unitID'. Value: (null) 
2013-08-01 17:11:49.336 CarpetDirect[138:1507] T restkit.object_mapping:RKMappingOperation.m:550 Mapping attribute value keyPath 'value' to 'value' 
2013-08-01 17:11:49.338 CarpetDirect[138:1507] T restkit.object_mapping:RKMappingOperation.m:572 Mapped attribute value from keyPath 'value' to 'value'. Value: 939 Puddle 
2013-08-01 17:11:49.339 CarpetDirect[138:1507] T restkit.object_mapping:RKMappingOperation.m:550 Mapping attribute value keyPath 'option_type' to 'optionTypeID' 
2013-08-01 17:11:49.342 CarpetDirect[138:1507] T restkit.object_mapping:RKMappingOperation.m:583 Skipped mapping of attribute value from keyPath 'option_type to keyPath 'optionTypeID' -- value is unchanged (0) 
2013-08-01 17:11:49.345 CarpetDirect[138:1507] D restkit.object_mapping:RKMappingOperation.m:1021 Finished mapping operation successfully... 
2013-08-01 17:11:49.348 CarpetDirect[138:1507] 

Любые идеи о том, как я могу ускорить это? Все, что я хочу сделать, это взорвать данные с сервера на Core Data.

+0

Являются ли эти 9000 отдельных запросов? Если это так, то это 900 в минуту, 15 в секунду, вероятно, не будет намного быстрее. – Thilo

+1

Это все в одном запросе на сервер. Джсон возвращается быстро, так что это не проблема. Проблема заключается в времени, которое требуется RestKit для заливки данных в Core Data. – user2379765

+0

Я испортил первый фрагмент кода. Это должно быть: RKEntityMapping * optionMapping = [RKEntityMapping mappingForEntityForName: @ "Option" inManagedObjectStore: rkMOS]; [optionMapping addAttributeMappingsFromDictionary: @ { @ "ID": @ "optionID", @ "option_type": @ "optionTypeID", @ "единица": @ "UnitID", @ "значение": @ "значение" }]; optionMapping.identificationAttributes = @ [@ "optionID"]; – user2379765

ответ

2

Трудно сказать много без дополнительного контекста, но каковы ваши варианты регистрации RestKit? По моему опыту, отображение журналов в RestKit очень многословно, замедляя работу в 10 раз.

Отключить все записи RestKit и посмотреть, улучшилось ли что-либо. Затем, если все еще есть проблема, используйте «Инструменты» для профилирования вашего приложения - вы должны легко увидеть, какие пути кода занимают большую часть времени (разбор, отображение RestKit, базовые данные и т. Д.)

+1

Регистрация действительно проблема с RestKit, с точки зрения производительности. Хороший совет! – magma

Смежные вопросы