2016-06-24 4 views
2

私はRealte for Swiftを使用していて、データをUITableViewにロードしています。私は画面に入ると徐々にダウンロードされている約200のデータオブジェクトがあるので、テーブルビューが表示された後、私のテストでUITableViewに多くの挿入が行われます。私はRealmCollectionChangeと一緒にaddNotificationBlockをできるだけ近くでRealmの例を使用しています。このプロセス中に時々起こる2つの別々のクラッシュが発生しています。addNotificationBlock {RealmCollectionChange}がUITableViewでクラッシュする

  1. ***キャッチされていない例外 'RLMException'のためアプリを終了しています、理由: 'runloops内からの通知ブロックのみを追加できます。'

このクラッシュは、ViewControllerクラス内のメインスレッドからすべてのデータを取得しても発生します。

  • ***アサーション失敗 - [のUITableView _endCellAnimationsWithContext:]、/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3512.30.14/UITableView .m:1720 ****キャッチされていない例外 'NSInternalInconsistencyException'によるアプリケーションの終了、理由: '無効な更新:セクション0の行数が無効です。更新(27)後に既存のセクションに含まれる行数は、更新前のそのセクションに含まれる行の数に等しい(17)、そのセクションに挿入または削除された行の数をプラスまたはマイナスし(挿入された9個、削除された0個)、プラスまたはマイナスに移動した行の数(0は移動し、0は移動しました)。私は私のaddNotificationBlock

    の.Update()セクションに

    tableView.beginUpdates() 
         tableView.insertRowsAtIndexPaths(insertions.map { NSIndexPath(forRow: $0, inSection: 0) }, 
          withRowAnimation: .Automatic) 
         tableView.deleteRowsAtIndexPaths(deletions.map { NSIndexPath(forRow: $0, inSection: 0) }, 
          withRowAnimation: .Automatic) 
         tableView.reloadRowsAtIndexPaths(modifications.map { NSIndexPath(forRow: $0, inSection: 0) }, 
          withRowAnimation: .Automatic) 
         tableView.endUpdates() 
    

    tableView.reloadData() 
    

    を交換した後

  • このクラッシュは発生し始めた私が欠けている何かがありますこれを引き起こしているレルムについて?私はそれが私がこのライブラリの内部メカニズムを完全に理解していないためだと思う。

    は、ここに参考のために私のコードです:あなたがここに物事を少し過度に複雑かもしれないようですね

    self.exhibits = DataManager.getAllExhibitsSorted("id") 
    token = self.exhibits?.addNotificationBlock { (changes: RealmCollectionChange) in 
        switch changes { 
        case .Initial(_): 
    
        self.exhibits = DataManager.getAllExhibitsSorted("id") 
        self.exhibitListTableView.reloadData() 
        break 
        case .Update(_, let deletions, let insertions, let modifications): 
    
        // Query results have changed, so apply them to the UITableView 
        self.exhibitListTableView.beginUpdates() 
        self.exhibitListTableView.insertRowsAtIndexPaths(insertions.map { NSIndexPath(forRow: $0, inSection: 0) }, 
         withRowAnimation: .Automatic) 
        self.exhibitListTableView.deleteRowsAtIndexPaths(deletions.map { NSIndexPath(forRow: $0, inSection: 0) }, 
         withRowAnimation: .Automatic) 
        self.exhibitListTableView.reloadRowsAtIndexPaths(modifications.map { NSIndexPath(forRow: $0, inSection: 0) }, 
         withRowAnimation: .Automatic) 
        self.exhibitListTableView.endUpdates() 
    
        break 
        case .Error: 
        NSLog("Error in notificationBlock") 
        break 
        } 
    } 
    

    答えて

    2

    レルムResultsオブジェクトはライブで自動更新されます。基礎となるオブジェクトに対する意味の変更は、メイン実行ループの次の反復で自動的に更新されるため、手動で再フェッチする必要はありません。あなたのコードでは、トークンが生成された後に.Initialの変更通知内にself.exhibitsを再度取り込みました。ここで問題が発生している可能性があります。その行を削除しても、そのまま動作します。

    コードを実行して、self.exhibitsが1回だけ割り当てられていることと、変更通知方法がその1つにのみ適用されていることを確認することをおすすめします。

    これで解決できない場合は教えてください。

    +0

    ありがとう、それはトリックでした! –

    +0

    それはほとんどの時間を修正することができましたが、ダウンロード中に無線LANのオンとオフを切り替えると、まだNSInternalInconsistencyExceptionが発生しています。おそらく、notificationBlock間の競合状態です。更新とself.exhibits内に存在する値。そのエラーをどのように捕捉するかについてのちょっとした助けさえあれば十分でしょう。 .Updateのものはどれもエラーを投げかけることはないので、do-catchでそれを囲むことはできません。 –

    +0

    私は全く同じ問題を抱えています。あなたはこれを解決しましたか?それはレルムのどこかの競合状態のようです。私はレルムのドキュメントに示されているようにコード100%を使用しています... –

    関連する問題