使用managedObjectCache时的Restkit映射

时间:2015-05-20 17:19:59

标签: ios objective-c core-data restkit

我使用Restkit将大数据集映射到Core数据。我正在打电话从Web服务获取数据,将其存储在核心数据中,然后从核心数据中显示数据。 这是我的代码。

+(void) setupManagedObjectStore
{
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
    NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];  
    RKManagedObjectStore *store = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];

    NSError *error = nil;
    BOOL success = RKEnsureDirectoryExistsAtPath(RKApplicationDataDirectory(), &error);   
    if (! success)
    {
        NSLog(@"Failed to create Application Data Directory at path '%@': %@", RKApplicationDataDirectory(), error);
    }

    NSString *path = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"MyFile.sqlite"];

    //Does lightweight migration automatically
    NSDictionary *options = @{
                          NSMigratePersistentStoresAutomaticallyOption : @YES,
                          NSInferMappingModelAutomaticallyOption : @YES
                          };   
    NSPersistentStore *persistentStore = [store addSQLitePersistentStoreAtPath:path fromSeedDatabaseAtPath:nil withConfiguration:nil options:options error:&error]; 
    if (! persistentStore)
    {
        NSLog(@"Failed adding persistent store at path '%@': %@", path, error);
     } 
    [store createManagedObjectContexts];   
    store.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:store.persistentStoreManagedObjectContext];

    [[RKObjectManager sharedManager] setManagedObjectStore:store];
}

获取数据,删除表格中的现有数据并添加新数据

-(void)getData:(SuccessBlock)successBlock withFailure:(FailureBlock)failureBlock objectId:(NSString *) objectId
{
    [self deleteData:objectId]; //Deletes the data from the entity
    NSString *path = [NSString stringWithFormat:@"getData/%@",objectId];
    [[RKObjectManager sharedManager] getObjectsAtPath:path parameters:nil
                                          success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult){
                                              NSLog(@"SUCCESS in getting data");
                                              if(successBlock){
                                                  successBlock([self getDataFromCoreData:objectId]);
                                              }

                                          failure:^(RKObjectRequestOperation *operation, NSError *error){
                                              NSLog(@"FAILURE in getting data");                                          

                                          }
 ];    
}

-(NSArray *)getDataFromCoreData : objectId
{
    NSArray *array = [[NSArray alloc] init];

    NSManagedObjectContext *context = [[[RKObjectManager sharedManager] managedObjectStore] mainQueueManagedObjectContext];
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"MyEntity"];
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"objectId= %@", objectId];

    NSError *error;
    array = [context executeFetchRequest:fetchRequest error:&error];
    return array;
}

我的核心数据模型有很多1:很多关系,而且我的Restkit映射非常慢,因此提高了我添加行的性能

store.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:store.persistentStoreManagedObjectContext];

这确实提高了性能,但在deleteData()调用之后,Restkit映射似乎交替发生。

调用getData - 1:getDataFromCoreData返回数据
调用getData - 2:getDataFromCoreData返回空数组,表空为
调用getData - 3:getDataFromCoreData返回数据
调用getData - 4:getDataFromCoreData返回空数组,表是空的

如果我注释掉store.managedObjectCache行,一切正常,getDataFromCoreData总是返回数据。但Restkit映射变得非常慢 我无法在RKInMemoryManagedObjectCache上找到足够的文档来了解究竟发生了什么......

有人可以帮助我理解为什么会以这种方式运作吗?或者可能建议一种更好的方法来改进Restkit映射性能?

编辑:添加删除代码

-(void)deleteData : objectId
{
    NSManagedObjectContext *context = [[[RKObjectManager sharedManager] managedObjectStore] mainQueueManagedObjectContext];
    NSArray *array = [self getDataFromCoreData: objectId];
    for (NSManagedObject *product in array)
    {      
        [context deleteObject:product];
    }
}

1 个答案:

答案 0 :(得分:0)

我明白了。在deleteData方法调用之后,我不得不做一个saveToPersistentStore。

我使用managedStoreManagedObjectContext作为managedObjectCache和mainQueueManagedObjectContext来保存到核心数据和检索。 persistentStoreManagedObjectContext vs mainQueueManagedObjectContext

因此,在删除之后和进行Web服务调用之前,使用saveToPersistentStore保存上下文修复了问题。