0

Restkit と Core Data を使用して、Web サービスからデータをフェッチして保存しています。2 つの問題があります。1 つ目は、3200 レコードの取得に約 10 秒かかることです。そんなに遅くなくてもいいと思います。これが私のコードです:

- (void)fetchDataFromRemote{

    RKManagedObjectMapping *coursesMapping = [RKManagedObjectMapping mappingForClass:[Course class] inManagedObjectStore:[[RKObjectManager sharedManager] objectStore]];
    [coursesMapping mapKeyPathsToAttributes:@"code", @"code",@"name",@"name", nil];
    //Set the primary key. Records in this way are not duplicated when fetched
    coursesMapping.primaryKeyAttribute = @"code";
    [[[RKObjectManager sharedManager] mappingProvider] setMapping:coursesMapping forKeyPath:@"course"];

    RKManagedObjectMapping *cacheMapping = [RKManagedObjectMapping mappingForClass:[Cache class] inManagedObjectStore:[[RKObjectManager sharedManager] objectStore]];
    [cacheMapping mapKeyPathsToAttributes:@"updated",@"updated",@"expires",@"expires", nil];
    //Set the primary key. Records in this way are not duplicated when fetched
    cacheMapping.primaryKeyAttribute = @"expires";

    [coursesMapping mapRelationship:@"cache" withMapping:cacheMapping];
    [[[RKObjectManager sharedManager] mappingProvider] setMapping:cacheMapping forKeyPath:@"cache"];

    RKURL *URL = [RKURL URLWithBaseURL:[[RKObjectManager sharedManager] baseURL] resourcePath:@"/course/-" queryParameters:nil];

    [[RKObjectManager sharedManager] loadObjectsAtResourcePath:[NSString stringWithFormat:@"%@", [URL resourcePath]] delegate:self];
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    NSLog(@"Start:%@",[NSDate date]);
}

そして、ここでサーバーからの応答を受信すると:

- (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects
{

    NSLog(@"End:%@",[NSDate date]);
    //Dismiss the activity indicator
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

    NSLog(@"objects[%d]", [objects count]);

    self.coursesArray = objects;

    //Initialize the filtered array
    self.filteredCoursesArray = [[NSMutableArray alloc] initWithCapacity:[self.coursesArray count]];

    [self.tableView reloadData];

}

ウェブで見つけたチュートリアルとそれほど変わらないと思います。

代わりに、2番目の問題は前述の方法に関連していfetchDataFromRemote: ます。この一連の行を追加すると:

RKManagedObjectMapping *cacheMapping = [RKManagedObjectMapping mappingForClass:[Cache class] inManagedObjectStore:[[RKObjectManager sharedManager] objectStore]];
        [cacheMapping mapKeyPathsToAttributes:@"updated",@"updated",@"expires",@"expires", nil];
        //Set the primary key. Records in this way are not duplicated when fetched
        cacheMapping.primaryKeyAttribute = @"expires";

        [coursesMapping mapRelationship:@"cache" withMapping:cacheMapping];
        [[[RKObjectManager sharedManager] mappingProvider] setMapping:cacheMapping forKeyPath:@"cache"];

tableview:cellForRowAtIndexPath:オブジェクトが「コース」オブジェクトではなく「キャッシュ」オブジェクトであるように見えるため、「キャッシュ」オブジェクトが知らないセレクターにメッセージを送信するとアプリがクラッシュするため、例外が発生しました。すべてがうまくいく前に行を削除すると、その関係を設定する必要があります。私は Core Data の初心者です。

どんな助けでも本当に感謝します! ありがとう

4

2 に答える 2

1

あなたの方法は私にとって良さそうです。3200 個のオブジェクトで 10 秒という時間はかなり遅いように見えますが、マッピングと関係によって異なります。

インポート中にエラーをチェックしたい場合は、1) スキームで SQL 出力を有効にするか、2) RestKit が提供するすべての出力をログに記録して、インポートのエラーを特定します。これにより、進行が遅くなります。

1) -com.apple.CoreData.SQLDebug 1 // Add in "Arguments" Tab > "Arguments Passed On Launch"
2) RKLogConfigureByName("RestKit/*", RKLogLevelTrace); // Add to AppDelegate
于 2012-11-25T10:20:43.977 に答える
0

問題はコード自体にあります。フィルタリングされた配列をいくつかのカウントで初期化しますが、オブジェクトを追加しません。メソッドを次のように置き換えると、これは解決されます。

- (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects
{

    NSLog(@"End:%@",[NSDate date]);
    //Dismiss the activity indicator
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

    NSLog(@"objects[%d]", [objects count]);

    self.coursesArray = objects;

    //Initialize the filtered array
    self.filteredCoursesArray = [[NSMutableArray alloc] initWithobjects:objects];

    [self.tableView reloadData];
`]
于 2012-11-23T20:30:24.507 に答える