【问题标题】:Realm DB in Swift And Object Mapper (Json)Swift 中的 Realm DB 和 Object Mapper (Json)
【发布时间】:2016-08-01 06:21:05
【问题描述】:

Halo Guys,我是 Swift 编程的新手,我遇到了一个问题,我在用户通过身份验证后使用 Realm DB 来存储我的数据。来自服务器应用程序的结果已映射为 json 字符串,它的工作,在 json 转换为对象/模型后,我将其放入领域数据库,

下面是代码:

print(response.text)
                let requestResult:RequestResult = Mapper<RequestResult>().map(response.text)!
                var publicLogin : PublicLogin = Mapper<PublicLogin>().map(requestResult.result)!
                let t : String = Mapper<PublicLogin>().toJSONString(publicLogin)!
                print("TTT===== "+t)
                dispatch_sync(dispatch_queue_create("background", nil)){
                    let realm = try! Realm()
                    try! realm.write{
                        realm.add(publicLogin)
                        publicLogin = realm.objects(PublicLogin.self)[0]
                        let x : String = Mapper<PublicLogin>().toJSONString(publicLogin)!
                        print(" ########## \n : "+x)
                        let sideMenu = SSASideMenu(contentViewController: UINavigationController(rootViewController: HomeViewController()), leftMenuViewController: LeftMenuViewController(), rightMenuViewController: RightMenuViewController())
                        let color:UIColor = UIColor(netHex:0x000000)
                        sideMenu.view.backgroundColor = color
                        sideMenu.configure(SSASideMenu.MenuViewEffect(fade: true, scale: true, scaleBackground: false))
                        sideMenu.configure(SSASideMenu.ContentViewEffect(alpha: 1.0, scale: 0.7))
                        sideMenu.configure(SSASideMenu.ContentViewShadow(enabled: true, color: UIColor.blackColor(), opacity: 0.6, radius: 6.0))
                        self.presentViewController(sideMenu, animated: true, completion: nil)
                        self.loginButton.selected = false ;
                        progress.Close()
                    }
                }

我确定,json 数据第一次是有效的,我将控制台/日志放在下面详细说明我的情况:

但是在我放入领域数据库并尝试返回后,它似乎是 null / nil 对象,下面是控制台 / 日志

{} 字符串应该是 json 对象...这就是问题

任何人都可以帮助我解释使用领域数据库的正确方法,或者如果您注意到我的代码中的错误?谢谢。

【问题讨论】:

  • 1.您应该添加尝试从 DB 读取的方式。 2.您是否设置具有唯一标识符的对象? 3. 您正在后台线程上进行 UI 操作。这不是好的做法。
  • 1 - 是的,先生,我就是这样做的。我注意到它很像示例: realm.objects(PublicLogin.self)[0] 2 - 还没有 先生,我稍后会添加,我从文档中阅读,它用于更新功能,所以我认为只有在我想要的时候才需要它更新领域 db 3 中的现有数据 - 我进行了同步,因为只有当结果来自服务器并放入领域 db 时才应该出现 UI,否则它不应该更改页面/UI
  • 2.那么您如何尝试访问该对象?你缺少代码.. 3. 你永远不应该在后台线程上更改 UI。如果您正在等待异步任务完成,您仍然可以返回 UI 线程并对其进行更改。它会以非常奇怪的方式影响你,或者只是不起作用。
  • 2 - 你可以看看上面的代码,先生,这是我用来访问对象的方式,请给我例子.. 3 - 不,我的意思是我必须等待任务并远离我的 UI 中的任何更改,用户都应该等待并且在任务完成之前不做任何事情。它就像简单的身份验证,其中 UI 状态必须保持进度,而在另一个 / UI 线程中没有任何操作
  • 很难准确判断导致此致命错误的强制展开的位置。假设它是 toJSONString(publicLogin)! 行,我建议在这里使用 Xcode 和 LLDB 来单步执行函数并确定它返回 nil 的原因。

标签: json swift realm


【解决方案1】:

您正在尝试保存对象,然后在同一写入事务中访问它。您应该将其保存在写入事务中,然后在事务块完成后访问它。 除此之外,您正在更改 UI 元素,在后台线程和写入事务中,这是错误的。我很伤心,只在主线程上处理 UI。

这是一个例子:

let requestResult:RequestResult = Mapper<RequestResult>().map(response.text)!
var publicLogin : PublicLogin = Mapper<PublicLogin>().map(requestResult.result)!
let t : String = Mapper<PublicLogin>().toJSONString(publicLogin)!
print("TTT===== "+t)
dispatch_sync(dispatch_queue_create("background", nil)){
    let realm = try! Realm()
    try! realm.write{
        realm.add(publicLogin)
    }
    dispatch_async(dispatch_get_main_queue(), { 
        publicLogin = realm.objects(PublicLogin.self)[0]
        let x : String = Mapper<PublicLogin>().toJSONString(publicLogin)!
        print(" ########## \n : "+x)
        let sideMenu = SSASideMenu(contentViewController: UINavigationController(rootViewController: HomeViewController()), leftMenuViewController: LeftMenuViewController(), rightMenuViewController: RightMenuViewController())
        let color:UIColor = UIColor(netHex:0x000000)
        sideMenu.view.backgroundColor = color
        sideMenu.configure(SSASideMenu.MenuViewEffect(fade: true, scale: true, scaleBackground: false))
        sideMenu.configure(SSASideMenu.ContentViewEffect(alpha: 1.0, scale: 0.7))
        sideMenu.configure(SSASideMenu.ContentViewShadow(enabled: true, color: UIColor.blackColor(), opacity: 0.6, radius: 6.0))
        self.presentViewController(sideMenu, animated: true, completion: nil)
        self.loginButton.selected = false ;
        progress.Close()
    })
}

我建议你甚至不要为这个更新移动到后台线程,写事务对于你在这里执行的线程之间的上下文切换来说并不是一个非常繁重的任务.. 再次取决于具体情况.. 您可以像这样保持简单:

   let requestResult:RequestResult = Mapper<RequestResult>().map(response.text)!
    var publicLogin : PublicLogin = Mapper<PublicLogin>().map(requestResult.result)!
    let t : String = Mapper<PublicLogin>().toJSONString(publicLogin)!
    print("TTT===== "+t)
        let realm = try! Realm()
        try! realm.write{
            realm.add(publicLogin)
        }
    publicLogin = realm.objects(PublicLogin.self)[0]
    let x : String = Mapper<PublicLogin>().toJSONString(publicLogin)!
    print(" ########## \n : "+x)
    let sideMenu = SSASideMenu(contentViewController: UINavigationController(rootViewController: HomeViewController()), leftMenuViewController: LeftMenuViewController(), rightMenuViewController: RightMenuViewController())
    let color:UIColor = UIColor(netHex:0x000000)
    sideMenu.view.backgroundColor = color
    sideMenu.configure(SSASideMenu.MenuViewEffect(fade: true, scale: true, scaleBackground: false))
    sideMenu.configure(SSASideMenu.ContentViewEffect(alpha: 1.0, scale: 0.7))
    sideMenu.configure(SSASideMenu.ContentViewShadow(enabled: true, color: UIColor.blackColor(), opacity: 0.6, radius: 6.0))
    self.presentViewController(sideMenu, animated: true, completion: nil)
    self.loginButton.selected = false ;
    progress.Close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 2021-05-10
    • 2016-12-31
    • 2023-04-06
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多