首页 > 解决方案 > 如何按修改日期对核心数据对象进行排序并在 tableView 中以正确的顺序列出?

问题描述

很长一段时间以来,我一直在努力cellstableView它们按正确的顺序移动。我希望能够cells使用rx.itemMoved. 该订单还必须随着时间的推移而持续存在,因此我将其保存到coreData,然后sort根据Date此处的建议进行保存:

有没有办法按照添加对象的时间顺序对核心数据进行排序?

但我似乎无法正确排序。我认为我不完全了解如何根据日期对其进行排序。

我模拟这样的数据:

func mockData() {
    let entity = NSEntityDescription.entity(forEntityName: "LocalDoorCoreDataObject", in: context)
    var data: [LocalDoorCoreDataObject] = []
    for i in 1...3 {
        let myEntity = LocalDoorCoreDataObject(entity: entity!, insertInto: context)
        myEntity.dCount = Int16(i)
        myEntity.dName = "M \(i)"
        data.append(myEntity)
    }
    viewModel.mockedRelay.accept(data.compactMap{ RemoteTableViewCellViewModel(localDoor: $0)})
}

这会触发bind我的tableView

func setBindings() {
    viewModel.mockedRelay.bind(to: tableView.rx.items(cellIdentifier: RemoteTableViewCell.identifier, cellType: RemoteTableViewCell.self)) { row, data, cell in
        cell.viewModel = data
    }.disposed(by: disposeBag)
}

现在,当我将 acell从一个地方拖到另一个地方时:

tableView.rx.itemMoved.subscribe(onNext: { [weak self] indexPaths in
    let delete = self?.viewModel.mockedRelay.value[indexPaths.sourceIndex.row]
    self?.deleteOne(position: indexPaths.sourceIndex.row) //deletes object in core data 

    self?.setData2(data: delete!) //add the moved object to cd. A new date is added to it
    self?.completionRelay?.accept("DATA SAVED") //Saves data for core data
}).disposed(by: disposeBag)

当我将新对象添加到coreData新日期时:

extension LocalDoorCoreDataObject {
    public override func awakeFromInsert() {
        setPrimitiveValue(Date(), forKey: "dModifiedDate")
    }
}

现在,我不明白的是date应该如何帮助我按照我离开时的方式对其进行排序view。如果我有三个cells并移动其中一个,则移动cell的会更高date,而其他两个会更低dates。如果我把移动的东西cell放在中间怎么办?那么它的更高日期将如何帮助我呢?这是fetch代码:

func fetchMyData2() {
        let request = NSFetchRequest<LocalDoorCoreDataObject>(entityName: "LocalDoorCoreDataObject")
        do {
            Observable.of(try context?.fetch(request))
                .map { item in
                    item?.sorted(by: {(item1, item2) -> Bool in
                        let ordered = item1.dModifiedDate?.compare(item2.dModifiedDate!) == .orderedAscending
                        return ordered
                    })
                }
                .subscribe(onNext: { value in
                    self.viewModel.mockedRelay.accept(value!.compactMap {
                        return RemoteTableViewCellViewModel(localDoor: $0)})
                })
                .disposed(by: disposeBag)

        } catch {
            print("error", error.localizedDescription) }
    }

如果有什么我解释得不够清楚或者我需要发布其他代码,请告诉我。我知道其中很多都是糟糕的代码,但我真的只想让它现在工作。

标签: iosswiftsortinguitableviewrx-swift

解决方案


好的,我通过这样做解决了它:

var items = self.mockedRelay.value
let item = items.remove(at: indexPaths.sourceIndex.row)
items.insert(item, at: indexPaths.destinationIndex.row)

现在array按我想要的方式排序,我可以向它添加索引值:

for (index, item) in items.enumerated() {
    item.localDoor.dRow = Int16(index)
}

就是这样!objects每次移动时所有的新索引值cells


推荐阅读