在Swift中使用带有Realm的ObjectMapper时程序崩溃

时间:2016-06-23 14:53:01

标签: swift realm objectmapper

如果我使用带有普通swift类的ObjectMapper,我可以创建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没有任何内容时,第一行会执行,但是当它确实有数据时,它就会崩溃。     如果您需要更多信息,请告诉我

1 个答案:

答案 0 :(得分:2)

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

  

注意:使用ObjectMappers&#39;生成Realm对象的JSON字符串。 toJSON函数仅在Realm写入事务中有效。这是因为ObjectMapper在其映射函数(inout)中使用<-标志,用于序列化和反序列化。 Realm检测到该标志并强制在写入块中调用toJSON函数,即使这些对象未被修改。

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

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