15

わずか 9,000 個のオブジェクトをダウンロードする場合、RestKit のパフォーマンスは容認できないほど遅くなります。シミュレーターでは 10 分、iPad Mini では無限の時間がかかります。

安らかなインターフェイスからダウンロードしているテーブルがいくつかあります。それはすべて機能しますが、多くのオブジェクトがあると耐えられなくなる指数関数的なスケールの問題があるようです. 次の表に最も問題があります。

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

コンソール出力は、マッピングが順調に進んでいることを示していますが、それには永遠に時間がかかります. 以下は、そのような何千ものスニペットからの 1 つのスニペットです。

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 にデータを爆破することだけです。

4

1 に答える 1