Ios UICollectionViewCell中的领域对象级别通知

Ios UICollectionViewCell中的领域对象级别通知,ios,swift,notifications,realm,Ios,Swift,Notifications,Realm,我有一个包含相册对象的集合视图。一张相册可以通过点击单元格内的按钮来表示喜欢或不喜欢。按钮图像根据相册是否受欢迎而变化。这部分很简单,也很有效 我的问题是: 如果选择一个单元格,将显示一个新的视图控制器,其中包含该单元格中的相册对象。在此视图控制器中,您可以喜欢或不喜欢相册对象。现在,当我关闭此视图控制器时,单元格中的按钮不会根据Album的isFavorite属性进行更新。 我认为解决方案是在UICollectionViewCell内使用。因此,当您在不同的视图控制器中喜爱/不喜爱相册时,当您

我有一个包含相册对象的集合视图。一张相册可以通过点击单元格内的按钮来表示喜欢或不喜欢。按钮图像根据相册是否受欢迎而变化。这部分很简单,也很有效

我的问题是:

如果选择一个单元格,将显示一个新的视图控制器,其中包含该单元格中的相册对象。在此视图控制器中,您可以喜欢或不喜欢相册对象。现在,当我关闭此视图控制器时,单元格中的按钮不会根据Album的isFavorite属性进行更新。 我认为解决方案是在UICollectionViewCell内使用。因此,当您在不同的视图控制器中喜爱/不喜爱相册时,当您返回到收藏视图时,按钮是最新的。但是我不知道如何添加和删除通知-比如在哪里添加/删除以及在哪里根据通知进行更新

注意:请不要说使用collectionView.reloadData

这就是我到目前为止注意到的注释:var notificationToken:notificationToken?//这是我为领域添加通知的地方吗


有什么想法吗?

我知道您不想被告知使用重载数据,但您是否考虑过重载项sat:[indepath]?这只会加载您首先单击的单元格。。。根据您的情况,这可能是一种更简单的方法

也就是说,我认为当单元格的相册值发生变化时,应该添加通知块。比如:

var album: Album! {
    didSet {
        self.notificationToken = album.addNotificationBlock { change in
           // The block code
        } 
    }
}

我知道你说过不要提到重载数据,但是如果视图控制器保证在屏幕外,并且会被调回屏幕上,我会直接调用重载数据,甚至只是重载​项目卫星:​ [索引​路径]将可见项的索引路径传递到视图将显示视图控制器的Animated:方法

这将比管理通知令牌集容易得多,尤其是当视图控制器在屏幕上时,如果您甚至没有使用通知令牌,那么首先:

这就是说,如果您希望避免手动更新视图,当它在屏幕上和屏幕外并且始终依赖于通知时,那么是的,领域的对象级通知将是最适合使用的功能,是的,将逻辑添加到集合视图单元格子类将是最合适的

class AlbumCollectionViewCell: UICollectionViewCell {
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var favoriteButton: UIButton!

    weak var delegate: AlbumCollectionViewCellDelegate?
    var album: Album!

    var notificationToken: NotificationToken? 

    @IBAction func didTapFavoriteButton(_ sender: UIButton) {
        delegate?.didTapFavoriteButton(sender, album: album)
    }

    override func prepareForReuse() {
        notificationToken.stop()
        notificationToken = nil
    }

    func configure(with album: Album) {
        titleLabel.text = album.title
        favoriteButton.isSelected = album.isFavorite
        self.album = album

        notificationToken = self.album.addNotificationBlock { change in
            switch change {
            case .change(let properties):
                for property in properties {
                    if property.name == "isFavorite" {
                        self.favoriteButton.isSelected = self.album.isFavorite
                    }
                }
            }
        }
    }
}

它工作得非常完美,非常感谢您如此清晰的解释,非常感谢!Realm和它背后的整个团队简直太棒了哈哈,太棒了!很高兴听到!不客气!我们都很高兴听到你在Realm玩得很开心DWe在使用Realm时遇到了一个小问题,希望是在启动应用程序之前的最后一个问题。我查看了领域任务的示例代码,但用例并不相似。你能看一下这个吗:谢谢!
class AlbumCollectionViewCell: UICollectionViewCell {
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var favoriteButton: UIButton!

    weak var delegate: AlbumCollectionViewCellDelegate?
    var album: Album!

    var notificationToken: NotificationToken? 

    @IBAction func didTapFavoriteButton(_ sender: UIButton) {
        delegate?.didTapFavoriteButton(sender, album: album)
    }

    override func prepareForReuse() {
        notificationToken.stop()
        notificationToken = nil
    }

    func configure(with album: Album) {
        titleLabel.text = album.title
        favoriteButton.isSelected = album.isFavorite
        self.album = album

        notificationToken = self.album.addNotificationBlock { change in
            switch change {
            case .change(let properties):
                for property in properties {
                    if property.name == "isFavorite" {
                        self.favoriteButton.isSelected = self.album.isFavorite
                    }
                }
            }
        }
    }
}