首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Alamofire从数组中获取数据并在CollectionCell中显示?

如何使用Alamofire从数组中获取数据并在CollectionCell中显示?
EN

Stack Overflow用户
提问于 2019-06-04 07:48:11
回答 1查看 157关注 0票数 1

我正在创建一个需要从API拉取数据的应用程序,场景是,我将获取以下json数据:

代码语言:javascript
复制
[
  {
    "chargeId": "33fbbbd0-2e33-11e9-a2cb-8a27ecbbcb73",
    "chargeDate": "2019-02-12T03:28:44.000",
    "vatRate": "NON-VAT",
    "taxRate": 0.1,
    "policyGroup": "Patient Participation",
    "itemDescription": "Ecg at er/icu df",
    "scdFlag": 0,
    "amounts": null,
    "scdDiscounts": 0,
    "othDiscounts": 4.54,
    "adjustment": 0,
    "pfBill": 222.46,
    "vatAmount": 0,
    "taxableAmount": 11.12,
    "merchantDiscount": 0,
    "creditedAmount": 211.3,
    "chargeAmount": null,
    "previousCredits": null
},
{
    "chargeId": "5a2cabc1-46c9-11e9-a2cf-863c7cdffd18",
    "chargeDate": "2019-03-15T10:24:21.000",
    "vatRate": "NON-VAT",
    "taxRate": 0.1,
    "policyGroup": "Patient Participation",
    "itemDescription": "Professional Fees",
    "scdFlag": 0,
    "amounts": null,
    "scdDiscounts": 0,
    "othDiscounts": 0,
    "adjustment": 0,
    "pfBill": 1000,
    "vatAmount": 0,
    "taxableAmount": 100,
    "merchantDiscount": 0,
    "creditedAmount": 900,
    "chargeAmount": null,
    "previousCredits": null
  }
 ]

我使用下面的Alamofire代码成功拉取了数据:

代码语言:javascript
复制
    typealias getPatientDetailsPerPayoutTaskCompletion = (_ patientDetailsPerPayout: [PatientPayoutDetails]?, _ error: NetworkError?) -> Void

  static func getPatientDetailsPerPayout(periodId: Int, doctorNumber: String, parameterName: PatientParameter, hospitalNumber: String, completion: @escaping getPatientDetailsPerPayoutTaskCompletion) {


        guard let patientDetailsPerPayoutURL = URL(string: "\(Endpoint.Patient.patientPayoutDetails)?periodId=\(periodId)&doctorNumber=\(doctorNumber)\(parameterName.rawValue)\(hospitalNumber)") else {

            completion(nil, .invalidURL)
            return
        }

        let sessionManager = Alamofire.SessionManager.default
        sessionManager.session.getAllTasks { (tasks) in
            tasks.forEach({ $0.cancel() })
        }

        Alamofire.request(patientDetailsPerPayoutURL, method: .get, encoding: JSONEncoding.default).responseJSON { (response) in
            print(patientDetailsPerPayoutURL)
            guard HelperMethods.reachability(responseResult: response.result) else {
                completion(nil, .noNetwork)
                return
            }

            guard let statusCode = response.response?.statusCode else {
                completion(nil, .noStatusCode)
                return
            }

            switch(statusCode) {
            case 200:
                guard let jsonData = response.data else {
                    completion(nil, .invalidJSON)
                    return
                }

                let decoder = JSONDecoder()

                do {
                    let patientDetailsPayout = try decoder.decode([PatientPayoutDetails].self, from: jsonData)
                    completion(patientDetailsPayout, nil)
                } catch {
                    completion(nil, .invalidJSON)
                }

            case 400: completion(nil, .badRequest)
            case 404: completion(nil, .noRecordFound)
            default:
                print("**UNCAPTURED STATUS CODE FROM (getPatientDetailsPayout)\nSTATUS CODE: \(statusCode)")
                completion(nil, .uncapturedStatusCode)
            }
        }

JSON Data将显示在CollectionCell中,用户将点击cell查看一个chargedId下的数据,但不幸的是,当我点击cell时,将提取所有数据,而不是仅提取阵列的一部分。下面的代码是我用来拉取部分数组的代码:

代码语言:javascript
复制
typealias getSelectedPatientItemDetailsTaskCompletion = (_ selectedpatient: PatientPaymentDetails?, _ error: NetworkError?) -> Void

static func getPatientItemDetails(periodId: Int, doctorNumber: String, parameterName: PatientParameter, hospitalNumber: String, chargeId: String, completion: @escaping getSelectedPatientItemDetailsTaskCompletion) {


    guard let patientDetailsPerPayoutURL = URL(string: "\(Endpoint.Patient.patientPayoutDetails)?periodId=\(periodId)&doctorNumber=\(doctorNumber)\(parameterName.rawValue)\(hospitalNumber)") else {

    completion(nil, .invalidURL)
    return
    }

    let sessionManager = Alamofire.SessionManager.default
    sessionManager.session.getAllTasks { (tasks) in
    tasks.forEach({ $0.cancel() })
    }

    Alamofire.request(patientDetailsPerPayoutURL, method: .get, encoding: JSONEncoding.default).responseJSON { (response) in
    print(patientDetailsPerPayoutURL)

    guard HelperMethods.reachability(responseResult: response.result) else {
    completion(nil, .noNetwork)
    return
    }

    guard let statusCode = response.response?.statusCode else {
    completion(nil, .noStatusCode)
    return
    }

    switch(statusCode) {
    case 200:
    guard let jsonData = response.data else {
   completion(nil, .invalidJSON)
    return
   }

   let decoder = JSONDecoder()

   do {
    let patientDetailsPayout = try decoder.decode(PatientPaymentDetails.self, from: jsonData)
   completion(patientDetailsPayout, nil)
   } catch {
  completion(nil, .invalidJSON)
   }

    case 400: completion(nil, .badRequest)
    case 404: completion(nil, .noRecordFound)
    default:
    print("**UNCAPTURED STATUS CODE FROM (getPatientDetailsPayout)\nSTATUS CODE: \(statusCode)")
    completion(nil, .uncapturedStatusCode)
                }
            }
        }
    }
}

用于拉取数据的Didselect函数

代码语言:javascript
复制
switch indexPath.section {
    case 0:
       self.selectedCardIndex = indexPath
       let selectedItem = selectedItemDescription.id
       getItemDetails(parameter: .searchByChargedId, from: selectedItem)
        let cardController = UserCardViewController.init(nibName: "UserCardViewController", bundle: nil)

        present(cardController, animated: true, completion: nil)

    default: break
        }
    }

getItemDetails函数

代码语言:javascript
复制
 func getItemDetails(parameter: PatientParameter, from: String) {

 APIService.PatientList.getPatientItemDetails(periodId: currentRemittance.periodId, doctorNumber: doctorNumber, parameterName: parameter, hospitalNumber: patient.hospitalNumber!, chargeId: from) { (getItem, error) in

        guard let pageItemDescription = getItem, error == nil else {
            SVProgressHUD.dismiss()
            return
        }

        switch parameter {
        case .selectedByChargedID:
            if self.patientPayoutDetails == nil {
                self.selectedPatientItemDescription = pageItemDescription
            }else {
                self.patientPayoutDetails.append(contentsOf: pageItemDescription.chargedId)
            }

        default: break
        }
        SVProgressHUD.dismiss()

        }
} 

希望你能帮助我,很抱歉,如果我几乎包括了所有的代码,但我只是想向你展示我的代码流程。我已经花了将近一周的时间来研究它。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2019-06-04 08:35:12

您的两个函数getPatientItemDetailsgetPatientDetailsPerPayout都从同一个URL中检索数据:

代码语言:javascript
复制
guard let patientDetailsPerPayoutURL = URL(string: "\(Endpoint.Patient.patientPayoutDetails)?periodId=\(periodId)&doctorNumber=\(doctorNumber)\(parameterName.rawValue)\(hospitalNumber)") else {

对于不同的端点,您可能有不同的URL;请验证这两种方法的URL,确保使用适当的URL。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56435795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档