gpt4 book ai didi

objective-c - RestKit:连接不在响应中的关系

转载 作者:搜寻专家 更新时间:2023-10-30 20:20:48 25 4
gpt4 key购买 nike

假设在我的数据模型中,我有 Pages,其中有许多 Comments

我想在模型中连接一个从 Comment 返回到它所属的 Page 的关系,但是 Page 对象没有嵌套在响应中,也没有任何可以识别父 Page 的主键存在在响应中。

在我调用 loadObjectsAtResourcePath 时,加载的所有 Comments 都应该属于一个固定的已知 Page 对象。我可以建立这种关系的一种方法是:

loader.onDidLoadObjects = ^(NSArray* objs) {
for (Comment* comment in objs) comment.page = self.page;
...
}

但我希望有更好的方法。请注意,我不能使用 connectRelationship 系列方法,因为在响应中没有主键可以让我将每个 Comment 连接到一个 Page.

最佳答案

您可以使用委托(delegate)方法 - (void)objectLoader:(RKObjectLoader *)loader willMapData:(inout id *)mappableData 在映射步骤之前注入(inject)额外的参数。如果您使用的是核心数据,它可以确保 RestKit 正确保存对象和关系(请注意,您在上面提供的解决方案不会保存关系)。

或者,查看 this回答我展示了如何覆盖 RKObjectLoader 以从 URL 本身检索页面信息的地方。

编辑:这是我在评论中提到的类别:

.h

#import <RestKit/RestKit.h>

typedef void(^RKObjectLoaderWillMapDataBlock)(id* mappableData);

@interface RKObjectLoader (Extended)

@property (nonatomic, copy) RKObjectLoaderWillMapDataBlock onWillMapData;

@end

和.m:

#import <objc/runtime.h>

NSString* kOnWillMapDataKey = @"onWillMapData";

@implementation RKObjectLoader (Extended)

- (RKObjectLoaderWillMapDataBlock) onWillMapData {
return objc_getAssociatedObject(self, &kOnWillMapDataKey);
}

- (void) setOnWillMapData:(RKObjectLoaderWillMapDataBlock) block {
objc_setAssociatedObject(self, &kOnWillMapDataKey, block, OBJC_ASSOCIATION_COPY);
}

- (RKObjectMappingResult*)mapResponseWithMappingProvider:(RKObjectMappingProvider*)mappingProvider toObject:(id)targetObject inContext:(RKObjectMappingProviderContext)context error:(NSError**)error {
id<RKParser> parser = [[RKParserRegistry sharedRegistry] parserForMIMEType:self.response.MIMEType];
NSAssert1(parser, @"Cannot perform object load without a parser for MIME Type '%@'", self.response.MIMEType);

// Check that there is actually content in the response body for mapping. It is possible to get back a 200 response
// with the appropriate MIME Type with no content (such as for a successful PUT or DELETE). Make sure we don't generate an error
// in these cases
id bodyAsString = [self.response bodyAsString];
RKLogTrace(@"bodyAsString: %@", bodyAsString);
if (bodyAsString == nil || [[bodyAsString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length] == 0) {
RKLogDebug(@"Mapping attempted on empty response body...");
if (self.targetObject) {
return [RKObjectMappingResult mappingResultWithDictionary:[NSDictionary dictionaryWithObject:self.targetObject forKey:@""]];
}

return [RKObjectMappingResult mappingResultWithDictionary:[NSDictionary dictionary]];
}

id parsedData = [parser objectFromString:bodyAsString error:error];
if (parsedData == nil && error) {
return nil;
}

// Allow the delegate to manipulate the data
if ([self.delegate respondsToSelector:@selector(objectLoader:willMapData:)]) {
parsedData = [parsedData mutableCopy];
[(NSObject<RKObjectLoaderDelegate>*)self.delegate objectLoader:self willMapData:&parsedData];
}

if( self.onWillMapData ) {
parsedData = [parsedData mutableCopy];
self.onWillMapData(&parsedData);
}

RKObjectMapper* mapper = [RKObjectMapper mapperWithObject:parsedData mappingProvider:mappingProvider];
mapper.targetObject = targetObject;
mapper.delegate = (id<RKObjectMapperDelegate>)self;
mapper.context = context;
RKObjectMappingResult* result = [mapper performMapping];

// Log any mapping errors
if (mapper.errorCount > 0) {
RKLogError(@"Encountered errors during mapping: %@", [[mapper.errors valueForKey:@"localizedDescription"] componentsJoinedByString:@", "]);
}

// The object mapper will return a nil result if mapping failed
if (nil == result) {
// TODO: Construct a composite error that wraps up all the other errors. Should probably make it performMapping:&error when we have this?
if (error) *error = [mapper.errors lastObject];
return nil;
}

return result;
}

@end

关于objective-c - RestKit:连接不在响应中的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11776941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com