【问题标题】:Swift Post Array of Realm Object领域对象的 Swift Post 数组
【发布时间】:2021-12-26 14:19:13
【问题描述】:

我必须闲置 Realm 对象

import Foundation
import RealmSwift

class CartMeal: Object {
  @objc dynamic var id = 0
  @objc dynamic var name = ""
  @objc dynamic var qty = 0
  @objc dynamic var price = 0
    
}

我的控制器尝试将 CartMeal 的数组发布到 API,如下所示

class CartView: UIViewController , UITableViewDelegate,UITableViewDataSource {
  
    

  var cartMeals = [CartMeal]()

  override func viewDidLoad() {
      super.viewDidLoad()
      fetchData()
  }


func fetchData(){
        let mealCount = RealmManager.instance.getCartMeal().count
        print(mealCount)
        if(mealCount == 0){
            
        }else{
            self.cartMeals.append(contentsOf: RealmManager.instance.getCartMeal())
        }

    }

 @objc func confirmOrder(){
       
        
        let url = URL(string: "http://192.1xxxxxxx/StoreResOrder")!
          var request = URLRequest(url: url)
          request.httpMethod = "POST"
          request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        
        let param  : [String : Any] = ["meals" : cartMeals]
          request.httpBody = try? JSONSerialization.data(withJSONObject: param, options: [])
         let configuration = URLSessionConfiguration.default
         configuration.timeoutIntervalForRequest = TimeInterval(30)
         configuration.timeoutIntervalForResource = TimeInterval(30)
        let session = URLSession(configuration: configuration)
         
          let task = session.dataTask(with: request) { (data, urlResponse, error) in
              if(error != nil){
                  DispatchQueue.main.async { ....

但我收到以下错误

'NSInvalidArgumentException', reason: 'Invalid type in JSON write (RLM:Managed 0 CartMeal)' 

如何解决这个问题,任何想法将不胜感激

【问题讨论】:

  • 发布问题时,重要的是要包括您的故障排除以及引发错误的行。最佳实践是添加断点并逐行检查变量和代码流。当某些事情不符合预期时,请包含代码,错误所在的行是您期望它执行的操作。截至目前,您在 JSON 写入中出现错误(与 Realm 无关),但我们不知道该错误发生在哪里。
  • *.com/questions/32023249/… 你可以做`试试? JSONSerialization.data(withJSONObject: someCartMealInstance, options: [])` 我猜它会失败。

标签: swift realm


【解决方案1】:

感谢cmets,我解决了如下问题

1- 使 Relam 对象可编码

class CartMeal: Object , Codable{
  @objc dynamic var id = 0
  @objc dynamic var name = ""
  @objc dynamic var qty = 0
  @objc dynamic var price = 0

    
     enum CodingKeys: String, CodingKey {
           
           case id, name,qty,price
     }
    
}

2- 使用 JSONEncoder 将我的数组转换为 Json 字符串

let jsonEncoder = JSONEncoder()
        do {
            let jsonData = try jsonEncoder.encode(cartMeals)
            jsonString = String(data: jsonData, encoding: .utf8)!
            
        }
        catch {
        }
        let param = ["meals" : jsonString]
          request.httpBody = try? JSONSerialization.data(withJSONObject: param, options: [])

【讨论】:

    最近更新 更多