【发布时间】: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的原因。