使用Restkit

时间:2015-06-22 18:58:45

标签: ios json swift restkit restkit-0.20

我将尝试尽可能描述这个问题......

方案

假设我有一个NSManagedObject'用户'

@class Premise;

@interface User : NSManagedObject

@property (nonatomic, retain) NSNumber * identifier;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSSet *premises;
@end

@interface User (CoreDataGeneratedAccessors)

- (void)addPremisesObject:(Premise *)value;
- (void)removePremisesObject:(Premise *)value;
- (void)addPremises:(NSSet *)values;
- (void)removePremises:(NSSet *)values;

@end

我还有一个NSManagedObject'前提'

@class User;

@interface Premise : NSManagedObject

@property (nonatomic, retain) NSNumber * identifier;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) User *user;

@end

基于它,我正在创建一个关系路由,将'Premise'的JSON数组映射到'User'对象的'premises'属性。

这是路线:

 let getPremisesRoute = RKRoute(relationshipName: "premises", 
                                objectClass: User.self, 
                                pathPattern: "user/:identifier/premises", 
                                method: .GET)

这是JSON响应(/ user / 1 / premises):

[
    {
        "id": 35,
        "name": "Icaraí"
    },
    {
        "id": 32,
        "name": "Remanso"
    }
]

这是响应描述符:

  let getPremisesResponseDescriptor = RKResponseDescriptor(mapping: premiseMapping, method: .GET, pathPattern: "user/:identifier/premises", keyPath: nil, statusCodes: RKStatusCodeIndexSetForClass(.Successful))

以下是“用户”和“前提”的相应映射

let userMapping = RKEntityMapping(forEntityForName: "User", inManagedObjectStore: moc)
userMapping.addAttributeMappingsFromDictionary(["id":"identifier", "name":"name"])      
userMapping.identificationAttributes = ["identifier"]
userMapping.addPropertyMapping(RKRelationshipMapping(fromKeyPath: nil, toKeyPath: "premises", withMapping: premiseMapping))


let premiseMapping = RKEntityMapping(forEntityForName: "Premise", inManagedObjectStore: moc)
premiseMapping.addAttributeMappingsFromDictionary(["id":"identifier", "name":"name"])
premiseMapping.identificationAttributes = ["identifier"]

现在问题

显然,Restkit在映射过程中有点困惑。这是请求后的数据库:

用户表: enter image description here

前提表:

enter image description here

请注意,实体之间没有创建关系。

现在,如果我将响应描述符的映射从前提更改为用户映射,则数据库将更改为:

用户表:

enter image description here

前提表:

enter image description here

我对发生的事情感到很困惑,我尝试了很多解决方案但没有成功。

JSON响应是否超出模式或我做错了什么? JSON响应似乎是一种常见模式,具有零密钥路径。

2 个答案:

答案 0 :(得分:1)

您正在接近映射错误,或者至少您的映射对于您正在执行的操作是错误的。考虑响应是用户,但只是用户的前提,而不是像现在一样将其视为简单的前提列表。然后映射到用户并插入前提。类似的东西:

$back

以下是“用户”和“前提”的相应映射

if (isset($_POST['add_artimage'])) {

    $front = $back = 'not uploaded';

    if ($_FILES["front"])
        $front = upload_file("front");

    if ($_FILES["back"])
        $back = upload_file("back");

    echo "image_front is $front <br> image_back is $back";
}

您在响应中没有用户名,因此您无法映射它,并且用户ID实际上在请求中,因此您需要使用元数据来提取它。

答案 1 :(得分:1)

好的,我找到了一个基于@Wain使用外键解决方案的解决方案。

我向'Premise'实体添加了一个新属性'userID',并使用元数据将其映射到URL上的标识符

let premiseMapping = RKEntityMapping(forEntityForName: "Premise", inManagedObjectStore: moc)

 premiseMapping.addAttributeMappingsFromDictionary(["id":"identifier", "name":"name", "@metadata.routing.parameters.identifier":"userID"])

然后我添加了与'premiseMapping'的关系连接

premiseMapping.addConnectionForRelationship("user", connectedBy: ["userID":"identifier"])

如果有人有更优雅的解决方案,请与我们分享。