RestKit 同步服务,临时对象的建议 - 如何
RestKit sync service, advice with temporary objects - How
我正在制作一些应用程序,我想为其提供离线功能。
问题在于从后端获取新数据作为未保存在持久存储中的临时对象。我为什么要这个?因为我想检查后端的数据是否比离线的数据更新(按更新日期)如果是则更新,否则将其发送到后端。
现在我正在尝试这样的事情:
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 次后上下文仍然脏。
以下内容实际上不太可能适用于您的情况,特别是因为 discardsInvalidObjectsOnInsert
的工作方式。
您可以通过执行以下过程来执行此操作,但另外在托管对象上实施 willSave
并检查那里的状态。如果您决定放弃更新,您可以尝试使用带有 NO
.
合并标志的 refreshObject:mergeChanges:
使用 KVC 验证,您有 2 个选项:
- 在导入时编辑单个数据
- 放弃整个对象的导入
选项 2. 要求您使用核心数据验证来防止导入。这意味着做一些事情,比如在对象上制作日期戳 non-optional(即必需),并在您的 KVC 验证中当您确定应该中止导入时将其设置为 nil。
请注意,要使其正常工作,您需要在实体映射上设置 discardsInvalidObjectsOnInsert
。
在@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];
}
}
非常感谢您的宝贵时间和帮助。
此致,阿德里安。
我正在制作一些应用程序,我想为其提供离线功能。 问题在于从后端获取新数据作为未保存在持久存储中的临时对象。我为什么要这个?因为我想检查后端的数据是否比离线的数据更新(按更新日期)如果是则更新,否则将其发送到后端。
现在我正在尝试这样的事情:
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 次后上下文仍然脏。
以下内容实际上不太可能适用于您的情况,特别是因为 discardsInvalidObjectsOnInsert
的工作方式。
您可以通过执行以下过程来执行此操作,但另外在托管对象上实施 willSave
并检查那里的状态。如果您决定放弃更新,您可以尝试使用带有 NO
.
refreshObject:mergeChanges:
使用 KVC 验证,您有 2 个选项:
- 在导入时编辑单个数据
- 放弃整个对象的导入
选项 2. 要求您使用核心数据验证来防止导入。这意味着做一些事情,比如在对象上制作日期戳 non-optional(即必需),并在您的 KVC 验证中当您确定应该中止导入时将其设置为 nil。
请注意,要使其正常工作,您需要在实体映射上设置 discardsInvalidObjectsOnInsert
。
在@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];
}
}
非常感谢您的宝贵时间和帮助。
此致,阿德里安。