edit: до сих пор я думаю, что я сузил проблему, сделанную для fetchresult в просмотре списка. когда запрос (предикат) fetch изменяется, он не повторяется.
Я создаю приложение todo с использованием swiftUI и Core Data. в listView у меня есть кнопка, которая изменит предикат для fetchrequest, но я не могу заставить его работать.
код в listView
struct HomeListView: View {
@Environment(\.managedObjectContext) var context
@FetchRequest(fetchRequest: ItemEntity.loadItems()) var items: FetchedResults<ItemEntity>
Text("someText")
.onTapGesture {
ItemEntity.predicateType.next() //next() is a method defined in core data entity class
}
код в ядре класс сущности данных
extension ItemEntity {
static var sortType = sort.ascending
static var predicateType = predicate.all
static func loadItems() -> NSFetchRequest<ItemEntity> {
var request: NSFetchRequest<ItemEntity> = ItemEntity.fetchRequest() as! NSFetchRequest<ItemEntity>
var predicate: NSPredicate {
switch predicateType {
case .all:
return NSPredicate(format: "type = %i", 0)
case .imur:
return NSPredicate(format: "type = %i", 0)
case .unimur:
return NSPredicate(format: "type = %i", 1)
case .imunur:
return NSPredicate(format: "type = %i", 2)
case .unimunur:
return NSPredicate(format: "type = %i", 3)
case .entry:
return NSPredicate(format: "type = %i", 4)
}
request.sortDescriptors = [sortDescriptor]
request.predicate = predicate
return request
}
enum predicate {
case all
case imur
case unimur
case imunur
case unimunur
case entry
mutating func next() {
switch self {
case .all:
self = .imur
case .imur:
self = .unimur
case .unimur:
self = .imunur
case .imunur:
self = .unimunur
case .unimunur:
self = .entry
case .entry:
self = .all
}
}
}
}
идея заключается в том, что когда пользователь нажимает кнопку в представлении списка, он вызывает метод next () и устанавливает для свойства предиката в классе ItemEntity другое значение, а затем для свойства предиката в loadItems ( ) обновит fetchrequest, затем просмотр списка перезагрузится.
Я знаю, что с этим подходом что-то не так, но я не могу понять, как это исправить. Спасибо за помощь!