2016-08-01 33 views
0

Halo Guys,我是Swift編程新手,我遇到了一個問題,我使用Realm DB來存儲用戶通過身份驗證後的數據。從服務器應用程序附帶的結果已經被映射爲JSON字符串,它的工作,經過JSON轉換爲object /模式,我把它放到境界DB,Swift和對象映射器(Json)中的Realm DB

下面

是代碼的:

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數據firsttime一直有效,我把下面的控制檯/登錄詳細說明我的情況:

enter image description here

但之後,我投入的境界DB,並試圖找回,它似乎爲null/nil對象,下面是console/log

enter image description here

{}字符串應該是一個JSON對象......這就是問題所在

任何人可以幫助我使用的境界DB或者如果您發現錯誤解釋的正確方法我的代碼是?謝謝。

+0

1.您應該添加您試圖從數據庫讀取的方式。 2.您是否使用唯一標識符設置對象? 3.你正在後面的線程上進行UI操作。這不是很好的做法。 – MCMatan

+0

1 - 是的,先生,我這樣做。我注意到它只是一個例子:realm.objects(PublicLogin.self)[0] 2 - 還沒有先生,我會在稍後添加的,我從文檔中讀取,它用於更新功能,所以我認爲只有當我需要時更新領域中的現有數據db 3 - 我做了同步,因爲只有當resut已經從服務器來到並放入領域數據庫時,UI纔會出現,如果不是,它應該不會改變頁面/ UI – Alfarabi

+0

你如何試圖訪問該對象?你缺少代碼.. 3.你永遠不應該改變後面的線程的用戶界面。如果您正在等待異步任務完成,則仍然可以移回UI線程並對其進行更改。它會以非常奇怪的方式影響你,或者只是不工作。 – MCMatan

回答

0

您正在嘗試保存該對象,然後在相同的寫入事務中訪問它。您應該將其保存在寫入事務中,然後在事務塊完成後訪問它。 除此之外,您正在更改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() 
    }) 
} 

我會建議你拿不動背線此更新,寫交易不是很沉重的主題,你在這裏做之間擔任司儀的contexet開關..再次它取決於具體情況.. 你可以只是保持簡單是這樣的:

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()