2017-02-01 6 views
0

SERVER_URLからデータをダウンロードし、ローカルデータベース - Realmに保存しています。 このデータベースのリストに項目を表示しようとしていますが、エラーが発生しています。私はいくつかのヒントに感謝するつもりです。iOS - Realmのアイテムリストを表示

Alamofire.request(SERVER_URL).responseJSON { response in 

     let items = [Item].from(jsonArray: response.result.value as! [Gloss.JSON]) 
     print(items?[0] as Any) 

     for item in items! { 

      let itemRealm = ItemRealm() 
      itemRealm.id = item.id! 
      itemRealm.name = item.name! 
      itemRealm.desc = item.descr! 
      itemRealm.icon = item.icon! 

      try! self.realm.write { 
       self.realm.add(itemRealm) 
      } 
     } 
    } 

    let items = realm.objects(ItemRealm.self) 
    print(items[0]) 

エラー - >は.....クラスAppDelegateに私を指示される - >スレッド1:信号SIGABRT

コンソールのエラーログ:

2017年2月1日16:51:20.701 iOSRecruitmentTest [15958:982747] *キャッチされていない例外 'RLMException'のためアプリを終了します。理由: 'インデックス0が範囲外です(0未満である必要があります)' *ファーストスローコールスタック:.... のlibC++ abi.dylib:

答えて

0

あなたlet items = realm.objects(ItemRealm.self)responseJSON閉鎖前に呼び出されるタイプNSExceptionのキャッチされない例外 (lldb)で終了します。

ネットワークコードは、通常が非同期で実行されることを忘れないでください!クロージャの中にコードを入れて、それを修正する必要があります。

Alamofire.request(SERVER_URL).responseJSON { response in 

    let items = [Item].from(jsonArray: response.result.value as! [Gloss.JSON]) 
    print(items?[0] as Any) 

    // !! Only one write transaction 
    try! self.realm.write { 
     for item in items! { 
      let itemRealm = ItemRealm() 
      itemRealm.id = item.id! 
      itemRealm.name = item.name! 
      itemRealm.desc = item.descr! 
      itemRealm.icon = item.icon! 
      self.realm.add(itemRealm) 
     } 
    } 

    // !! This code is now inside the closure 
    let itemRealms = realm.objects(ItemRealm.self) 
    print(itemRealms[0]) 
} 
+0

私が持っていたアイテム= realm.objectsを聞かせて変換するために:あなたは、この例ではあなたのような何かをすることにより、容易にそれを達成することができますすることができた場合にサイドノートで

は、またrealm.writeの数を制限しよう(ItemRealm.self)を_ = self.realm.objects(ItemRealm.self)に追加しました。これは、以前の値との定義の競合のエラーが発生したためです。これはうまくいくように思えますが、アプリをもう一度やり直したいときは以前と同じエラーが出るので、それを削除して新鮮なものを実行する必要があります。だから初めてのことです。あなたのご意見ありがとうございます。閉鎖後に何とかデータを削除する必要がありますか? – Vuko

+0

私は自分の答えを編集しました.Json結果を印刷したくないので、レルムオブジェクトを印刷したいと思います。私はあなたが達成しようとしていることを正確には知りませんが、このようなエラーがあれば、オプションを__safely unwrapして__error cases__を追加することをお勧めします。実際のコードで応答が空の場合、アプリケーションはクラッシュします。 –

+0

おい、ありがとう。それは非常に役に立ちます。私は単純なリストとデータベースとしての使用領域でいくつかのテストを行っています。私はviewDidLoad()に私のネットワーク接続を入れているので、クラッシュの問題が起こっていると思う。私が間違っているなら、私を訂正してください。今私はエラーログを読むことによって考える:データが保存されるので、再実行したときに再びダウンロードされ、 "id" = 0が既に存在する。それはクラッシュを説明します。 – Vuko

関連する問題