gpt4 book ai didi

swift - 在 Swift 中将 ObjectMapper 与 Realm 一起使用时程序崩溃

转载 作者:可可西里 更新时间:2023-11-01 01:35:39 24 4
gpt4 key购买 nike

如果我将 ObjectMapper 与普通的 swift 类一起使用,我能够创建 JSON 对象,但是当我将它与 Realm 类模型一起使用时,程序会崩溃。我试图解决它(检查对象是否存在,然后使用覆盖 primaryKey 方法但没有帮助)。我使用了 StackOverFlow 的 ListTransform 类,它似乎工作正常。 Xcode 没有提供任何关于异常终止的特定信息,以便我可以进行更多调试。其他 stackoverflow 帖子没有帮助。

            class UserResponse: Object, Mappable {

// MARK: Properties
//
var item = List<Item>()
dynamic var itemPurchaseDate = NSDate()

required convenience init?(_ map: Map) {
self.init()
}

func mapping(map: Map) {
item <- (map["item"], ListTransform<Item>())
itemPurchaseDate <- (map["itemPurchaseDate"], ISO8601DateTransform())
}
}

class ListTransform<T:RealmSwift.Object where T:Mappable> : TransformType {
typealias Object = List<T>
typealias JSON = [AnyObject]

let mapper = Mapper<T>()

func transformFromJSON(value: AnyObject?) -> Object? {
let results = List<T>()
if let value = value as? [AnyObject] {
for json in value {
if let obj = mapper.map(json) {
results.append(obj)
}
}
}
return results
}

func transformToJSON(value: Object?) -> JSON? {
var results = [AnyObject]()
if let value = value {
for obj in value {
let json = mapper.toJSON(obj)
results.append(json)
}
}
return results
}
}

class Item: Object, Mappable {

// MARK: Properties
//
dynamic var itemName = ""

required convenience init?(_ map: Map) {
self.init()
}

// Mapping between ObjectMapper (JSON) and the model properties
//
func mapping(map: Map) {
itemName <- map["itemName"]
}
}

class RealmManager {

// returns a dictionary which represents give mappable object
//
func jsonFormat<N: Mappable>(object: N) -> [String: AnyObject] {
return Mapper().toJSON(object)
}

func uploadDataToBackend(someObject: UserResponse) {
let postData = jsonFormat(someObject)
print(postData)
}
}

-----------------------------------------

Program crash on following lines:
1. In Item class, program crash on line itemName <- map["itemName"]
2. If I comment above line , then I get crash on itemPurchaseDate <- (map["itemPurchaseDate "], ISO8601DateTransform())

另请注意,当 Item 没有任何内容时,第一行会执行,但当它确实有数据时,它只会崩溃。 如果您需要更多信息,请告诉我

最佳答案

当使用 ObjectMapper 将 Realm 模型序列化为 JSON 时,您需要在写入事务中执行。或者使用 init(value:) 从 Realm 中分离对象.因为 ObjectMapper 即使在序列化时也会为模型的属性赋值。它只是分配相同的值,它不会修改,但 Realm 不允许在没有事务的情况下分配任何值。

Note: Generating a JSON string of a Realm Object using ObjectMappers' toJSON function only works within a Realm write transaction. This is caused because ObjectMapper uses the inout flag in its mapping functions (<-) which are used both for serializing and deserializing. Realm detects the flag and forces the toJSON function to be called within a write block even though the objects are not being modified.

另请参阅 ObjectMapper 文档中的 ObjectMapper + Realm 部分。

https://github.com/Hearst-DD/ObjectMapper#objectmapper--realm

关于swift - 在 Swift 中将 ObjectMapper 与 Realm 一起使用时程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37995133/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com