RestKit addFetchRequestBlock导致不映射对象

dee*_*ter 3 ios restkit

我设置了以下获取请求块来处理孤立对象的删除:

  [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删除所有数据,并上传登录数据从服务器重新查询并重新加载到核心数据.

我的问题是双重的.我需要更改什么才能获得成功重新加载数据的预期行为,为什么获取请求块(我理解为仅用于删除孤立对象)会对此方案产生影响?

我之前看过这个并且刚刚删除了获取请求块,但我更喜欢使用此功能而不是因为这个问题而跳过它.

lar*_*mba 5

我有这个确切的问题,并设法找到一个解决方案.基本上,如果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)

希望有所帮助!