我在Mac应用程序中使用App.net消息API,该应用程序使用带有AFIncrementalStore的核心数据。我有一个渠道实体,它有几种不同的方式与用户实体相关。有一种"所有者"关系,它很简单,运行良好。但也有两个ACL实体:Channel的读者和作者。
ACL只是一个键值对象,它包括一组用户ID,我不知道如何使用AFIncrementalStore来处理这种关系。
我正在提取一个Channel实体,它附加了一个ACL对象("写入程序"),其中包含一个用户ID数组:
"writers": {
"any_user": false,
"immutable": true,
"public": false,
"user_ids": [
"1",
],
"you": true
},
我已经在核心数据中设置了我的关系("writerUsers"与用户之间有一对多的关系),但我在AFIS中无法确定在哪里配置它。
我尝试过实现- (NSDictionary *)representationsForRelationshipsFromRepresentation:(NSDictionary *)representation ofEntity:(NSEntityDescription *)entity fromResponse:(NSHTTPURLResponse *)response
,但这似乎只有在服务器响应包括实际对象值时才有效——整个用户实体,而不仅仅是ID。
我还看到过使用- (NSURLRequest *)requestWithMethod:(NSString *)method
pathForRelationship:(NSRelationshipDescription *)relationship
forObjectWithID:(NSManagedObjectID *)objectID
withContext:(NSManagedObjectContext *)context
提供URL请求以获取用户对象的例子。。。但该方法从未从我的AFHTTPClient子类中调用过。
那么,当我只有一个ID时,我如何教AFIncrementalStore拉入用户实体呢?
我能够解决我的问题。API应该在json:中使用这种格式
"users": [
{"id":1},
{"id":2}
]
即使API没有提供这种格式的数据,您也可以在AFRESTClient的子类中"伪造"它。
- (NSDictionary *)representationsForRelationshipsFromRepresentation:(NSDictionary *)representation
ofEntity:(NSEntityDescription *)entity
fromResponse:(NSHTTPURLResponse *)response {
NSMutableDictionary *mutableRelationshipRepresentations = [[super representationsForRelationshipsFromRepresentation:representation ofEntity:entity fromResponse:response] mutableCopy];
if ([entity.name isEqualToString:@"writer"]) {
NSArray *user_ids = [representation objectForKey:@"user_ids"];
NSMutableArray *users = [[NSMutableArray alloc] init];
for (NSNumber *id in user_ids) {
[users addObject:@{@"id":id}];
}
}
[mutableRelationshipRepresentations setObject:users forKey:@"users"];
return mutableRelationshipRepresentations;
}
当然,您需要将"用户"定义为模型中的多对多关系。当关系对象中只有id时,AFIncrementalStore将自动获取单个关系对象。