Hiệu suất RestKit không thể chấp nhận được khi tải xuống chỉ khoảng 9.000 đối tượng - mất 10 phút trên trình mô phỏng và thời gian vô hạn trên iPad Mini.Hiệu suất RestKit và dữ liệu lõi
Tôi có một số bảng tôi đang tải xuống từ giao diện an toàn. Tất cả đều hoạt động, nhưng dường như có một vấn đề quy mô theo cấp số mũ trở nên không thể chấp nhận được khi có nhiều đối tượng. Bảng sau có nhiều sự cố nhất:
optionMapping.identificationAttributes = @[@"optionID"];
// OptionType
RKEntityMapping *optionTypeMapping = [RKEntityMapping mappingForEntityForName:@"OptionType" inManagedObjectStore:rkMOS];
[optionTypeMapping addAttributeMappingsFromDictionary:@{
@"id" : @"optionTypeID",
@"option_type" : @"optionType",}];
optionTypeMapping.identificationAttributes = @[@"optionTypeID"];
Tùy chọn thuộc tínhTypeID được lập chỉ mục trong Dữ liệu cốt lõi và không bắt buộc.
Có một số mối quan hệ với các bảng khác, mà tôi đồ như sau:
// Option.optionType -> OptionType
[optionMapping addConnectionForRelationship:@"optionType" connectedBy: @"optionTypeID"];
// Option.unit -> Unit
[optionMapping addConnectionForRelationship:@"unit" connectedBy:@"unitID"];
Những điều này dường như không có vấn đề - tôi nhận xét họ ra, và việc tải xuống vẫn còn rất, rất chậm .
Tôi thiết lập bộ mô tả phản hồi (đây là danh mục, vì vậy tôi chỉ cần tải xuống). Lưu ý rằng mã sau đây cho thấy một thiết lập cho tất cả các bảng.
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];
Tôi đang sử dụng người quản lý đối tượng để tải về bảng:
[_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];
}
}];
Giao diện điều khiển đầu ra cho thấy rằng bản đồ được chugging cùng, nhưng nó sẽ mãi mãi. Sau đây chỉ là một đoạn từ hàng nghìn lượt thích:
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]
Bất kỳ ý tưởng nào về cách tôi có thể tăng tốc độ này? Tất cả những gì tôi muốn làm là làm nổ dữ liệu từ máy chủ đến Core Data.
Có 9000 yêu cầu riêng biệt không? Nếu vậy, đó là 900 mỗi phút, 15 mỗi giây, có thể sẽ không nhận được nhanh hơn nhiều. – Thilo
Đó là tất cả trong một yêu cầu đến máy chủ. Json quay lại nhanh chóng, vì vậy đó không phải là vấn đề. Vấn đề là thời gian để RestKit đổ dữ liệu vào Core Data. – user2379765
Tôi đã làm sai đoạn mã đầu tiên. Nó phải là: RKEntityMapping * optionMapping = [RKEntityMapping mappingForEntityForName: @ "Option" trongManagedObjectStore: rkMOS]; [optionMapping addAttributeMappingsFromDictionary: @ { @ "id": @ "optionID", @ "option_type": @ "optionTypeID", @ "unit": @ "unitID", @ "value": @ "value" }]; optionMapping.identificationAttributes = @ [@ "optionID"]; – user2379765