Производительность 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.
Являются ли эти 9000 отдельных запросов? Если это так, то это 900 в минуту, 15 в секунду, вероятно, не будет намного быстрее. – Thilo
Это все в одном запросе на сервер. Джсон возвращается быстро, так что это не проблема. Проблема заключается в времени, которое требуется RestKit для заливки данных в Core Data. – user2379765
Я испортил первый фрагмент кода. Это должно быть: RKEntityMapping * optionMapping = [RKEntityMapping mappingForEntityForName: @ "Option" inManagedObjectStore: rkMOS]; [optionMapping addAttributeMappingsFromDictionary: @ { @ "ID": @ "optionID", @ "option_type": @ "optionTypeID", @ "единица": @ "UnitID", @ "значение": @ "значение" }]; optionMapping.identificationAttributes = @ [@ "optionID"]; – user2379765