如何按修改日期对核心数据对象进行排序,并以正确的顺序在tableView中列出它?

问题描述 投票:1回答:1

我一直在努力地将cells移到tableView并按正确的顺序进行操作。我希望能够使用cellsrx.itemMoved从一个地方拖到另一个地方。该命令还必须随着时间的流逝而持续,因此我将其保存到coreData,然后根据sort将其保存为Date,如下所示:

Is there a way to keep the sorting in core data in the time order the objects are added?

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

我模拟这样的数据:

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)
}

现在将cell从一个位置拖到另一个位置:

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) }
    }

让我知道是否有一些我没有清楚解释的内容,或者是否需要发布其他代码。我知道很多都是不好的代码,但是我真的只想暂时使它工作。

ios swift sorting uitableview rx-swift
1个回答
0
投票

确定,我通过执行此操作解决了它:

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的新索引值。

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