我一直在努力地将cells
移到tableView
并按正确的顺序进行操作。我希望能够使用cells
将rx.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) }
}
让我知道是否有一些我没有清楚解释的内容,或者是否需要发布其他代码。我知道很多都是不好的代码,但是我真的只想暂时使它工作。
确定,我通过执行此操作解决了它:
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
的新索引值。