我正在制作一些应用,我想为它提供离线功能。 问题是从后端获取新数据,因为临时对象未保存在持久存储中。我为什么要这个?因为我想检查来自后端的数据是否比离线数据更新(按更新日期)如果是,则更新,否则,将其发送到后端。
现在我尝试这样的事情:
NSMutableURLRequest *apiEmailRequest = [[RKObjectManager sharedManager] requestWithObject:@"ApiEmail" method:RKRequestMethodGET path:pathToContent parameters:nil];
RKObjectRequestOperation *apiEmailOperation = [[RKObjectManager sharedManager] managedObjectRequestOperationWithRequest:apiEmailRequest managedObjectContext:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
*********************CHECK FOR BACKEND EMAILS AND OFFLINE ONE **********************
NSArray *backendEmails = [mappingResult array];
for (ApiEmail *backendEmail in backendEmails) {
if ([backendEmail isKindOfClass:[ApiEmail class]]) {
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"ApiEmail"];
NSPredicate *filterByApplication = [NSPredicate
predicateWithFormat:@"emailId == %@", backendEmail.emailId];
[fetchRequest setPredicate:filterByApplication];
NSArray *persistentEmails = [[RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext executeFetchRequest:fetchRequest error:nil];
*HERE PUT IT INTO mainQueueManagedObjectContext and
saveToPersistentStore else POST it to the backend*
}
}
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
*ERROR*
}];
return apiEmailOperation;
[[RKObjectManager sharedManager] enqueueObjectRequestOperation:apiEmailOperation];
有没有办法在不创建新的RKObjectManager的情况下执行此操作?
最好的问候,阿德里安。
更新
-(void)willSave {
[super willSave];
NSDictionary *remoteCommits = [NSDictionary dictionaryWithDictionary:[self committedValuesForKeys:@[@"updateDate"]]];
NSDate *updateDate = [remoteCommits valueForKey:@"updateDate"];
NSComparisonResult result = [self.updateDate compare:updateDate];
if(result == NSOrderedDescending) {
[self.managedObjectContext refreshObject:self mergeChanges:NO];
} else {
[self.managedObjectContext refreshObject:self mergeChanges:YES];
}
}
经过这样的修改后,我在保存之前未能处理挂起的更改。 1000次尝试后,上下文仍然很脏。
答案 0 :(得分:0)
以下内容不太适用于您的情况,特别是因为discardsInvalidObjectsOnInsert
的工作方式。
您可以通过执行以下过程来执行此操作,但另外在托管对象上实施willSave
并检查其状态。如果您决定放弃更新,可以尝试使用合并标记为refreshObject:mergeChanges:
的{{1}}。
通过KVC验证,您有两个选择:
选项2.要求您使用核心数据验证来阻止导入。这意味着做一些事情,比如在对象上设置日期戳是非可选的(即必需),在你的KVC验证设置中,当你确定导入应该被中止时,它会为nil。
请注意,为此,您需要在实体映射上设置NO
。
答案 1 :(得分:0)
在@Wain的大力帮助下,我终于开始工作了。没有这个勇敢的人我仍然会在沙箱里。解决方案:
-(BOOL)validateUpdateDate:(id *)ioValue error:(NSError **)outError {
NSComparisonResult result = [self.updateDate compare:(NSDate *)*ioValue];
if (result == NSOrderedDescending) {
self.updateDate = nil;
return NO;
}
return YES;
}
-(void)willSave {
[super willSave];
if (self.updateDate == nil) {
[self.managedObjectContext refreshObject:self mergeChanges:NO];
}
}
非常感谢您的时间和帮助。
最好的问候,阿德里安。