我使用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];
}
}
答案 0 :(得分:0)
我明白了。在deleteData方法调用之后,我不得不做一个saveToPersistentStore。
我使用managedStoreManagedObjectContext作为managedObjectCache和mainQueueManagedObjectContext来保存到核心数据和检索。
persistentStoreManagedObjectContext vs mainQueueManagedObjectContext
因此,在删除之后和进行Web服务调用之前,使用saveToPersistentStore保存上下文修复了问题。