2016-08-01 3 views
0

Halo Guys는 사용자가 인증 된 후 Realteb DB를 사용하여 문제가 발생했습니다. JSON 개체/모델로 변환 후 서버 응용 프로그램에서 나온 결과를 JSON 문자열 작업을 할 매핑하고있다, 나는 아래 Swift 및 Object Mapper (Json)의 Realm DB

이며, 영역 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() 
        } 
       } 
그것을

enter image description here

하지만 난이 영역 DB에 투입 한 후 다시 얻을려고 :

내가는 JSON 데이터 firsttime 내가 콘솔이/내 사건을 자세히 아래 로그 배치, 유효했다 확인했다 null/nil 오브젝트 인 것 같습니다. 아래 콘솔/로그입니다.

enter image description here

{} 문자열을 JSON 개체를해야합니다 ...이 문제입니다

사람은 실수에서 나는 경우 영역 DB를 사용하거나 올바른 방법을 설명하는 데 도움이 수 제 코드가요? 감사.

+0

1. 당신은 DB에서 읽으려고하는 방법을 추가해야합니다. 2. 개체를 고유 한 식별자로 설정하고 있습니까? 3. 백 스레드에서 UI 작업을하고 있습니다. 이것은 좋은 습관이 아닙니다. – MCMatan

+0

1 - 네, 저렇게 했어요. realm.objects (PublicLogin.self) [0] 2 - 아직 선생님, 나중에 추가 할 것입니다. 설명서에서 읽으므로 업데이트 기능을 사용하므로 필요한 경우에만 필요하다고 생각합니다. realm db에있는 기존 데이터를 업데이트합니다. resut가 서버에서 왔고 realm db에 넣은 경우에만 UI가 나타나야하기 때문에 동기가 발생했습니다. 그렇지 않으면 페이지/UI를 변경하지 않아야합니다. – Alfarabi

+0

2. 어떻게 그 객체에 접근하려고합니까? 당신은 실종 코드입니다 .. 3. 다시 스레드에서 UI를 변경해서는 안됩니다. 비동기 작업이 끝나기를 기다리는 중이라면 여전히 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 스위치에 compered 매우 무거운되지 않습니다 작성합니다 .. 다시 당신은 그냥이 같은 간단 유지할 수 있습니다 .. 상황에에 따라 달라집니다

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() 
관련 문제