簡體   English   中英

如何使用RestKit中的“ addAttributeMappings”添加實體類(DTO的值)的對象?

[英]How to add objects of entity class(DTO's value) using “addAttributeMappings” in RestKit?

我的json響應不僅包含字符串,還包含DTO數組。 對象映射的格式不正確。

json響應正文:

{
  "id": null,
  "componentName": "Home Loan",
  "dynamicTableDetailDTOList": [
    {
      "id": 1,
      "fieldName": "username",
      "fieldType": "string",
      "isJoin": false,
      "joinType": null,
      "joinTable": null,
      "joinField": null,
      "displayField": null,
      "defaultValue": null,
      "length": 30,
      "label": "Name",
      "isrequired": true,
      "searchable": null,
      "dynamicTable": null
    },
    {
      "id": 2,
      "fieldName": "age",
      "fieldType": "integer",
      "isJoin": false,
      "joinType": null,
      "joinTable": null,
      "joinField": null,
      "displayField": null,
      "defaultValue": null,
      "length": 2,
      "label": "Age",
      "isrequired": true,
      "searchable": null,
      "dynamicTable": null
    },
    {
      "id": 3,
      "fieldName": "Gender",
      "fieldType": "radio",
      "isJoin": false,
      "joinType": [
        {
          "displayId": 0,
          "Value": "Male"
        },
        {
          "displayId": 1,
          "Value": "Female"
        }
      ],
      "joinTable": null,
      "joinField": null,
      "displayField": null,
      "defaultValue": null,
      "length": 30,
      "label": "Gender",
      "isrequired": true,
      "searchable": null,
      "dynamicTable": null
    },
    {
      "id": 4,
      "fieldName": "education",
      "fieldType": "combo",
      "isJoin": false,
      "joinType": [
        {
          "displayId": 0,
          "Value": "Btech"
        },
        {
          "displayId": 1,
          "Value": "Mca"
        },
        {
          "displayId": 2,
          "Value": "Mba"
        },
        {
          "displayId": 3,
          "Value": "Mcom"
        }
      ],
      "joinTable": null,
      "joinField": null,
      "displayField": null,
      "defaultValue": null,
      "length": 30,
      "label": "Education",
      "isrequired": true,
      "searchable": null,
      "dynamicTable": null
    }
  ]
}

下面給出的是我的實體模型。 (請注意,dynamicTableDetailDTOList是DTO的數組):

class LoanDetailModel: NSObject {

    var id:Any?
    var componentName = ""
    var dynamicTableDetailDTOList:[DynamicTableDetailDTOList] = []
}

class DynamicTableDetailDTOList: NSObject {

    var id:Int?
    var fieldName:String = ""
    var fieldType:String = ""
    var isJoin:Bool?
    var length:Int?
    var label:String = ""
    var isrequired:Bool?
    var searchable:Bool?
}

在我的ViewController中,調用了一個回調方法,

override func viewDidLoad() {
    super.viewDidLoad()

    let loanDetailService = LoanDetailService()
    loanDetailService.getLoanDetails(success: { (model) in
        self.loanDetailModel = model!
        self.loanDetailTable.reloadData()
    })
    { (errorString) in
        let alert = UIAlertController(title: "Alert",
                                      message: errorString,
                                      preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil))
        self.present(alert, animated: true, completion: nil)
    }
}

在LoanDetailService類中,實現了與服務調用相關的所有代碼:

func getLoanDetails(success: @escaping((_ loanDetailModel: LoanDetailModel?) -> ()),
                    failure: @escaping ((_ error:String) -> ())) {

    // Define mappings
    let postMapping: RKObjectMapping = RKObjectMapping(for: LoanDetailModel.self)
    postMapping.addAttributeMappings(from: ["id", "componentName", "dynamicTableDetailDTOList"])


    // Define response decriptor
    let statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClass.successful)
    let resDescriptor = RKResponseDescriptor(mapping: postMapping, method: RKRequestMethod.GET, pathPattern: nil, keyPath: nil, statusCodes: statusCodes)

    // Create object manager
    let url = URL(string: baseURL)
    let jsonPlaceholderManager = RKObjectManager(baseURL: url)
    jsonPlaceholderManager?.addResponseDescriptor(resDescriptor)
    RKObjectManager.setShared(jsonPlaceholderManager)

    // Perform GET request
    RKObjectManager.shared().getObjectsAtPath(appendedURL, parameters: nil, success: { (operation, mappingResult) -> Void in
        let loanDetailModel: LoanDetailModel = mappingResult!.firstObject as! LoanDetailModel
        success(loanDetailModel)

    }) { (operation, error) -> Void in
        failure((error?.localizedDescription)!)
    }

}

如何對我的實體模型進行更改?

下面解決了我的問題:

在LoanDetailServiceClass中,

func getLoanDetails(success: @escaping((_ loanDetailModel: LoanDetailModel?) -> ()),
                failure: @escaping ((_ error:String) -> ())) {

    // Define mappings
    let postMapping: RKObjectMapping = RKObjectMapping(for: LoanDetailModel.self)
    postMapping.addAttributeMappings(from: ["id","componentName"])

    let dTOListMapping: RKObjectMapping = RKObjectMapping(for: DynamicTableDetailDTOList.self)
    dTOListMapping.addAttributeMappings(from: ["fieldName",
                                               "fieldType",
                                               "label"])
    postMapping.addRelationshipMapping(withSourceKeyPath: "DynamicTableDetailDTOList" ,
                                       mapping: dTOListMapping)

    // Define response decriptor
    let statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClass.successful)
    let resDescriptor = RKResponseDescriptor(mapping: postMapping, method: RKRequestMethod.GET, pathPattern: nil, keyPath: nil, statusCodes: statusCodes)

    // Create object manager
    let url = URL(string: baseURL)
    let jsonPlaceholderManager = RKObjectManager(baseURL: url)
    jsonPlaceholderManager?.addResponseDescriptor(resDescriptor)
    RKObjectManager.setShared(jsonPlaceholderManager)

    // Perform GET request
    RKObjectManager.shared().getObjectsAtPath(appendedURL, parameters: nil, success: { (operation, mappingResult) -> Void in
        let loanDetailModel: LoanDetailModel = mappingResult!.firstObject as! LoanDetailModel
        success(loanDetailModel)

    }) { (operation, error) -> Void in
        failure((error?.localizedDescription)!)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM