RealmSwift“对象已被删除或无效”

时间:2017-03-07 07:13:17

标签: ios swift realm

我正在尝试设计一个按钮,允许用户在集合视图表上“保存”列表。触摸按钮时,列表的数据将保存到领域,另一个视图控制器会显示此数据。

虽然我能够将数据保存到Realm并显示并删除它,如果我再次点击该按钮,如果我第三次点击它“对象已被删除或无效”,即使它是不同的清单。这是代码,可以让我们深入了解我正在尝试做的事情:

let lib = BookCollection()

let realm = try! Realm()

var unSavedBook = RealmBook()

func save(_ cell: HomeBookPreviewViewCell) {

    // This allows me to get the indexpath of a cell to use buttons on the collection view.

    guard let indexPath = self.bookListing.indexPath(for: cell) else {
        print("whaaaaaaa")
        return
    }


    if lib.Library[indexPath.item].saved {

        let savedBooks = realm.object(ofType: RealmBook.self, forPrimaryKey: lib.Library[indexPath.item].isbn!)
         try! realm.write {



            realm.delete(savedBooks!)

            //updates other view controller

            NotificationCenter.default.post(name: .reload, object: nil)
        }

        cell.saveButton.setImage(#imageLiteral(resourceName: "Star"), for: .normal)
        lib.Library[indexPath.item].saveBook(save: false)
    }
    else if (!lib.Library[indexPath.item].saved) {

        try! realm.write {
        //unSavedBooks is declared outside of function.

        //lib.Libary is an object that holds an array of Book objects with book attributes.

        unSavedBook.addRealmBook(lib.Library[indexPath.item].title!, lib.Library[indexPath.item].author!, lib.Library[indexPath.item].edition!, lib.Library[indexPath.item].publisher!, "\(lib.Library[indexPath.item].type!)", "\(lib.Library[indexPath.item].condition!)", "\(lib.Library[indexPath.item].subject!)", lib.Library[indexPath.item].seller!, RealmOptional<Float>(lib.Library[indexPath.item].price), lib.Library[indexPath.item].isbn!)

            realm.add(unSavedBook)

            //updates other view controller
            NotificationCenter.default.post(name: .reload, object: nil)

        }




        cell.saveButton.setImage(#imageLiteral(resourceName: "Star-Saved"), for: .normal)

        lib.Library[indexPath.item].saveBook(save: true)
    }
    print("Button tapped on row \(indexPath.item)")
}

我知道我需要使用已保存的布尔值来加载数据,但我不明白为什么它不允许我第三次点击。

2 个答案:

答案 0 :(得分:1)

当您尝试读取很可能已被删除的领域对象的属性时,您会看到此异常。请确保您没有对已删除的域对象的任何强引用,或尝试使用isInvalidated属性来处理该情况。

答案 1 :(得分:0)

我开发iOS时曾经使用过CoreData + Magical记录。而且只有当我开发Android应用程序时才能使用Realm。

夫妻问题,

  1. 与CoreData /其他现代数据库一样,您从领域查询中获取的结果会自动更新。 (参考:https://realm.io/docs/swift/latest/#auto-updating-results)。所以,我对你的NotificationCenter.default.post(name: .reload, object: nil)电话有点困惑。另外,您能向我们展示您的Collection View数据源委托方法实现吗?因为那里有一些Realm电话。
  2. 第二个问题是关于你的应用流程。根据我的理解,有Collection View,每个单元格显示Book。如果单击Book单元格,则会显示另一个视图以显示书籍信息。如果您第二次单击它,则会删除该书。但如果该书被删除,为什么使用可以第三次点击该单元?您是否期望删除Book单元格?发布几张截图对我们来说很有帮助:))