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

Ios RealmSwift“;“对象已被删除或无效”;,ios,swift,realm,Ios,Swift,Realm,我试图设计一个按钮,允许用户“保存”集合视图表上的列表。当按下按钮时,列表的数据将保存到realm,另一个视图控制器将显示该数据 当我第三次点击该按钮时,即使是另一个列表,我也可以将数据保存到域中,并显示和删除它。下面是一些代码,让您了解我正在尝试做什么: let lib = BookCollection() let realm = try! Realm() var unSavedBook = RealmBook() func save(_ cell: HomeBookPreviewVie

我试图设计一个按钮,允许用户“保存”集合视图表上的列表。当按下按钮时,列表的数据将保存到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)")
}
let lib=BookCollection()
让我试试!领域()
var unSavedBook=RealmBook()
func save(u单元格:HomeBookPreviewViewCell){
//这允许我获取单元格的indexpath,以便使用集合视图上的按钮。
guard let indexath=self.bookListing.indexath(for:cell)else{
印刷品(“Whaaaaaa”)
回来
}
如果lib.Library[indexath.item].已保存{
让savedBooks=realm.object(类型:RealmBook.self,forPrimaryKey:lib.Library[indexPath.item].isbn!)
试试看!写吧{
realm.delete(savedBooks!)
//更新其他视图控制器
NotificationCenter.default.post(名称:。重新加载,对象:nil)
}
cell.saveButton.setImage(#imageLiteral(resourceName:“Star”),用于:。正常)
lib.Library[indexath.item].saveBook(保存:false)
}
如果(!lib.Library[indexath.item].saved),则为else{
试试看!写吧{
//未录制的图书在函数外声明。
//Libary是一个对象,它包含一系列具有图书属性的图书对象。
unSavedBook.addRealmBook(lib.Library[indexath.item].title!、lib.Library[indexath.item].author!、lib.Library[indexath.item].edition!、lib.Library[indexath.item].publisher!、“\(lib.Library[indexath.item].condition!)、“\(lib.lib.Library[indexath.item].subject!)、lib.Library[indexath.item].seller!,RealmOptional(lib.Library[indexath.item].price),lib.Library[indexath.item].isbn!)
realm.add(unSavedBook)
//更新其他视图控制器
NotificationCenter.default.post(名称:。重新加载,对象:nil)
}
cell.saveButton.setImage(#imageLiteral(resourceName:“星形已保存”),用于:。正常)
lib.Library[indexath.item].saveBook(保存:true)
}
打印(“在行\(indexPath.item)上点击按钮”)
}

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

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

我在开发iOS时使用CoreData+Magic record。只有当我开发安卓应用程序时,才有领域

两个问题

  • 与CoreData/其他现代数据库一样,从领域查询获取的结果也会自动更新。(参考:)。所以,我对您的
    NotificationCenter.default.post(名称:.reload,对象:nil)
    调用有点困惑。另外,您能否向我们展示您的集合视图数据源委托方法实现?因为其中包含一些领域调用
  • 第二个问题是关于你的应用程序流。据我所知,有一个
    集合视图
    ,每个单元格显示一本
    书籍
    。如果单击
    书本
    单元格1,它将显示另一个视图以显示书本信息。如果你第二次点击它,你就会删除这本书。但是如果那本书被删除了,为什么use可以第三次点击那个单元格呢?您是否希望删除
    书本
    单元格?发布几张截图,我们很乐意帮助您:)

  • 你能发布更多的代码吗?因为我有点混淆了多个变量,比如
    lib.Library[indexath.item].saved
    。顺便说一句,你能发布几张截图吗,如果有一个清晰的idea@PangHoMing对其进行了编辑以使其更清晰一些,对于混乱的代码表示抱歉(我打算在以后删除它,因为我必须添加另一个组件。)