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 个选项:

  1. 在导入时编辑单个数据
  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];
    }
}

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

此致,阿德里安。