致命:提供的项目标识符不是唯一的。 DiffableDataSource 中的重复标识符

问题描述 投票:0回答:2

我正在尝试使用

DiffableDataSource
集合视图,我不断收到此错误

Fatal: supplied item identifiers are not unique. Duplicate identifiers

这是我的实现方式

extension UICollectionView {
    enum Section {
        case main
    }
}

class FeedsCollectionView: View {
    
    var collectionView: UICollectionView! = nil
    let layout:UICollectionViewFlowLayout = UICollectionViewFlowLayout.init()
    
    typealias DataSource = UICollectionViewDiffableDataSource<UICollectionView.Section, Scraper>
    typealias DataSourceSnapshot = NSDiffableDataSourceSnapshot<UICollectionView.Section, Scraper>
    
    private var dataSource : DataSource!
    private var snapshot: DataSourceSnapshot!
    
    public lazy var data: [Scraper] = [] {
        didSet {
            
            applySnapshot()

        }
    }
    
    private func configureDataSource() {
        dataSource = DataSource(collectionView: collectionView, cellProvider: { (collectionView, indexPath, data) in
            if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "feeds", for: indexPath) as? FeedsCollectionViewCell {
                cell.configure(with: data)
                
                cell.eventHandler = { [weak self] events in

                    switch events {

                    case .reload:
                       
                        
                        self?.applySnapshot()
                        
                    }

                }
                
                return cell

            }
            
            return UICollectionViewCell()
        })
        applySnapshot()
    }
    
    public func applySnapshot() {
        snapshot = DataSourceSnapshot()
        
        snapshot.appendSections([UICollectionView.Section.main])
        snapshot.appendItems(data)
        
        dataSource.apply(snapshot, animatingDifferences: true)
    }
                                
    private func createLayout() -> UICollectionViewLayout {
        
        return UICollectionViewCompositionalLayout { section, layoutEnvironment in
            var config = UICollectionLayoutListConfiguration(appearance: .sidebar)
            config.headerMode = section == 0 ? .none : .firstItemInSection
            return NSCollectionLayoutSection.list(using: config, layoutEnvironment: layoutEnvironment)
        }
    }
    
    
    private func configureHierarchy() {

        collectionView = UICollectionView(frame: bounds, collectionViewLayout: createLayout())
        
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        collectionView.register(FeedsCollectionViewCell.self, forCellWithReuseIdentifier: "feeds")


        addSubview(collectionView)
        
    }

    override func setupUI() {
        configureHierarchy()

        configureDataSource()
    }
    
    override func setupLayout() {
        LayoutConstraint.pin(to: .bounds, collectionView).activate()
    }
    
}

这里是 scrapper 类(其中一部分):

public class Scraper:  Hashable {
    
    let id = UUID()

    
    public func hash(into hasher: inout Hasher) {
      hasher.combine(id)
    }
    
    public static func == (lhs: Scraper, rhs: Scraper) -> Bool {
        lhs.id == rhs.id

    }

Scraper 类要大得多,我无法使其成为结构。如何修复此错误 非常感谢你

swift diffabledatasource
2个回答
0
投票

看起来你一遍又一遍地添加相同的项目......


0
投票

我也有同样的问题。由于某种原因,它从 iOS 18.0.1 开始一直在复制(可能是他们用多线程更新了一些东西)。

无论如何,这里的主要修复是确保您没有将重复项添加到您的

data
数组中(我们知道数组默认情况下没有提供它,与 set 相比)。因此,在调用
snapshot.appendItems(data)
之前,您需要确保数组不包含任何重复项。

您可以通过将

data
数组转换为 Set 并返回数组(如果顺序不是您的优先事项),或者通过遍历数组并手动删除所有重复项来完成此操作。

© www.soinside.com 2019 - 2024. All rights reserved.