RestKit中的addFetchRequestBlock导致对象无法映射

3

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

  [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;
}];

由于需要允许用户退出并重新登录,因此我使用以下方法清除Core Data中的所有数据:

 + (void) clearUserData {
    NSError * error = nil;
    [[RKManagedObjectStore defaultStore] resetPersistentStores:&error];
    if(error != nil){
        [WRUtilities criticalError:error];
        return;
    }
}

然而,如果我退出应用并重新登录,第一次登录时加载的对象不会从服务器加载。使用RestKit日志记录,我可以看到请求已发出,并从服务器返回正确的数据,但似乎完全跳过了映射,导致没有对象被(重新)插入到核心数据中。
如果删除我的抓取请求块,一切都像我预期的那样工作 - clearUserData删除所有数据,在登录上传数据时从服务器重新查询数据并重新加载到核心数据中。
我的问题有两个方面。我需要改变什么来获得成功重新加载数据的预期行为,以及我理解为仅用于删除孤儿对象的获取请求块对这种情况产生何种影响?
我以前也见过这种情况,只需删除获取请求块即可,但我更喜欢使用此功能而不是因为这个问题跳过它。
1个回答

5

我之前遇到过这个问题,但最终找到了解决方案。下面的代码只会在CoreData中存在项目时才返回获取请求(fetch request)。每次都返回获取请求(fetch request)的问题在于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;
}];

希望这能帮到您!

谢谢回复。我现在没有在处理这个问题,所以暂时无法验证并接受,但我已经点了赞。 - deepwinter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接