ios - 如何按修改日期对核心数据对象进行排序并在 tableView 中以正确的顺序列出?
问题描述
很长一段时间以来,我一直在努力cells
让tableView
它们按正确的顺序移动。我希望能够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) }
}
如果有什么我解释得不够清楚或者我需要发布其他代码,请告诉我。我知道其中很多都是糟糕的代码,但我真的只想让它现在工作。
解决方案
好的,我通过这样做解决了它:
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
。
推荐阅读
- php - 试图获取非对象的属性“名称” - Laravel
- c++ - C++ Curl 发布请求不起作用且没有错误
- javascript - 获取请求中的错误不会停止功能
- javascript - 在 Google docs pdf 查看器或替代查看器中显示私有 pdf
- python - 如何用python中的最新值替换文本文件中的一行?
- reactjs - 为什么在我键入时我的 React 文本/输入字段中没有出现任何内容?
- javascript - 如何从String中获取qql表达式
- react-native - React Native fetch:未定义不是对象
- visual-studio-code - 在 VSCode 中,如何突出显示不同颜色的每个变量,例如 Atom 的语义颜色?
- c# - LINQ + CSV:如何在 C# 中通过其标题拆分 CSV 文件