RestKit同步服务,临时对象的建议 - 如何

时间:2016-01-12 14:26:33

标签: ios core-data restkit

我正在制作一些应用,我想为它提供离线功能。 问题是从后端获取新数据,因为临时对象未保存在持久存储中。我为什么要这个?因为我想检查来自后端的数据是否比离线数据更新(按更新日期)如果是,则更新,否则,将其发送到后端。

现在我尝试这样的事情:

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次尝试后,上下文仍然很脏。

2 个答案:

答案 0 :(得分:0)

以下内容不太适用于您的情况,特别是因为discardsInvalidObjectsOnInsert的工作方式。

您可以通过执行以下过程来执行此操作,但另外在托管对象上实施willSave并检查其状态。如果您决定放弃更新,可以尝试使用合并标记为refreshObject:mergeChanges:的{​​{1}}。

通过KVC验证,您有两个选择:

  1. 在导入时编辑单个数据
  2. 放弃整个对象的导入
  3. 选项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];
    }
}

非常感谢您的时间和帮助。

最好的问候,阿德里安。