2013-08-01 5 views
15

RestKitのパフォーマンスは、9,000オブジェクトの恥ずかしがり屋をダウンロードすると、許容できないほど遅くなります。シミュレータでは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件のリクエストがありますか?もしそうなら、それは1分あたり900、毎秒15で、おそらくそれほど速くはなりません。 – Thilo

+1

これはすべてサーバーへの1回のリクエストです。 jsonはすぐに戻ってくるので、問題はありません。問題は、RestKitがデータをコアデータに流すのにかかる時間です。 – 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ロギングを無効にし、何か改善されているかどうかを確認します。それでも問題が解決しない場合は、Instrumentsを使用してアプリケーションをプロファイリングしてください。ほとんどのコードパス(解析、RestKitマッピング、コアデータなど)を簡単に見てください。

+1

ロギングは実際にはRestKitのパフォーマンス上の問題です。良いヒント! – magma

関連する問題