我设置了以下获取请求块来处理孤立对象的删除:
[objectManager addFetchRequestBlock:^NSFetchRequest *(NSURL *URL) {
RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:API_GET_ACTIVE_RIDES];
NSString * relativePath = [URL relativePath];
NSDictionary *argsDict = nil;
BOOL match = [pathMatcher matchesPath:relativePath tokenizeQueryStrings:NO parsedArguments:&argsDict];
if (match) {
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Ride"];
return fetchRequest;
}
return nil;
}];
Run Code Online (Sandbox Code Playgroud)
由于我需要允许用户注销并重新登录,因此我使用以下内容清除核心数据中的所有数据:
+ (void) clearUserData {
NSError * error = nil;
[[RKManagedObjectStore defaultStore] resetPersistentStores:&error];
if(error != nil){
[WRUtilities criticalError:error];
return;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我注销并重新登录到我的应用程序,则第一次登录时加载的对象不会从服务器加载.使用RestKit日志记录,我可以看到请求熄灭并从服务器返回正确的数据,但映射似乎完全被跳过,导致没有对象(重新)插入到核心数据中.
如果我删除了我的获取请求块,一切都按照我的预期工作 - clearUserData删除所有数据,并上传登录数据从服务器重新查询并重新加载到核心数据.
我的问题是双重的.我需要更改什么才能获得成功重新加载数据的预期行为,为什么获取请求块(我理解为仅用于删除孤立对象)会对此方案产生影响?
我之前看过这个并且刚刚删除了获取请求块,但我更喜欢使用此功能而不是因为这个问题而跳过它.
我有这个确切的问题,并设法找到一个解决方案.基本上,如果CoreData中存在现有项,则下面的代码将仅返回获取请求.一直返回它的问题意味着RestKit将首次删除您从服务器获得的项目.这里的想法是,如果CoreData中当前没有任何项目,则返回nil.不确定这是否是RestKit推荐的方式,但它对我有用.
RKObjectManager *sharedManager = [RKObjectManager sharedManager];
[sharedManager addFetchRequestBlock:^NSFetchRequest *(NSURL *URL) {
RKPathMatcher *userPathMatcher = [RKPathMatcher pathMatcherWithPattern:@"my/api/path"];
BOOL match = [userPathMatcher matchesPath:[URL relativePath] tokenizeQueryStrings:NO parsedArguments:nil];
if(match) {
// lets first check if we have anything in coredata
NSString * const entityName = NSStringFromClass([MyCoreDataEntity class]);
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:entityName];
NSError *error = nil;
NSManagedObjectContext *managedObjectContext = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext;
NSArray *results = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
if(error) {
// this shouldn't happen, but if something went wrong querying CoreData
// lets just save the new ones
NSLog(@"error %@", error);
return nil;
}
if([results count] > 0) {
// if we already have something saved, lets delete 'em and save
// the new ones
return [NSFetchRequest fetchRequestWithEntityName:entityName];
}
else {
// if we don't have something saved, lets save them
// (e.g. first time after login after we cleared everything on logout)
return nil;
}
}
return nil;
}];
Run Code Online (Sandbox Code Playgroud)
希望有所帮助!
| 归档时间: |
|
| 查看次数: |
612 次 |
| 最近记录: |