2013-08-01 34 views
15

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.

+0

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

+1

Đó 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

+0

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

Trả lời

2

Khó nói nhiều mà không có nhiều ngữ cảnh hơn, nhưng tùy chọn ghi nhật ký RestKit của bạn là gì? Theo kinh nghiệm của tôi, việc ghi lại bản đồ trong RestKit là rất tiết, làm chậm mọi thứ xuống gấp 10 lần.

Tắt tất cả ghi nhật ký RestKit và xem có bất kỳ điều gì đã được cải thiện hay không. Sau đó, nếu vẫn có sự cố, hãy sử dụng Công cụ để lập hồ sơ cho ứng dụng của bạn - bạn sẽ dễ dàng thấy các đường dẫn mã nào đang sử dụng hầu hết thời gian (phân tích cú pháp, Sao chép bản đồ, Dữ liệu chính, v.v.)

+1

Việc ghi nhật ký thực sự là vấn đề với RestKit, hiệu quả. Mẹo tốt! – magma

Các vấn đề liên quan