1

我在我的 Mac 应用程序中使用 App.net 消息传递 API,它使用 Core Data 和 AFIncrementalStore。我有一个Channel实体,它有几种与Users实体相关的不同方式。有一个简单且工作正常的“所有者”关系。但也有两个ACL实体:Channel 的读取器和写入器。

ACL 只是一个包含用户 ID 数组的键值对象,这是我不确定如何使用 AFIncrementalStore 处理的关系。

我正在拉出一个 Channel 实体,它附加了一个 ACL 对象(“writers”),其中包含一组用户 ID:

"writers": {
    "any_user": false,
    "immutable": true,
    "public": false,
    "user_ids": [
        "1",
    ],
    "you": true
},

我已经在 Core Data 中设置了我的关系(“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 拉入用户实体?

4

1 回答 1

0

我能够解决我的问题。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 会自动获取各个关系对象。

于 2013-10-04T14:14:19.497 回答