GroupBy с помощью @FetchRequest в SwiftUI - PullRequest
1 голос
/ 04 марта 2020

У меня есть вид SwiftUI, например:

@FetchRequest(
    entity: Message(),
    sortDescriptors: [NSSortDescriptor(keyPath: \Message.date, ascending: false)]
) var allMessages: FetchedResults< Message.date >

var body: some View {
    NavigationView {
        List(self.allMessages) { message in
            Text(message.text)
        }
        .navigationBarTitle(Text("Last Messages"))
    }
}

Я бы хотел, чтобы запрос FetchRequest возвращал только последнее сообщение каждого пользователя. Мне нужно использовать группу. Есть ли способ использовать @FetchRequest? Если нет, как бы вы поступили?

1 Ответ

0 голосов
/ 09 марта 2020

Шаг за шагом:

  1. Создание NSFetchRequest
  2. Укажите NSPredicate для фильтрации в соответствии с выбранными вами критериями
  3. Установите для resultType значение ".DictionaryResultType" (обязательно) для «Группировать по»)
  4. Установите свойства, которые будут включены в выборку.
  5. Установить свойства для группировки по
  6. Создать NSSortDescriptor для упорядочения по имени, по убыванию
  7. Наконец, вы можете создать @FetchRequest с помощью инициализатора "@FetchRequest (fetchRequest:")
class TODOItem: NSManagedObject, Identifiable {
    @NSManaged public var name: String?
    @NSManaged public var notes: String?
}

extension TODOItem {
    static func allTODOItem() -> NSFetchRequest<TODOItem> {
        //1º
        let fetchRequest = NSFetchRequest<TODOItem>(entityName: "TODOItem")
        //2º
        //fetchRequest.predicate = NSPredicate(format: "", ...)
        //3º
        fetchRequest.resultType = .dictionaryResultType
        //4º
        // To get computed props you can use NSExpression (for example the sum of something)
        fetchRequest.propertiesToFetch = ["name", "notes"]
        //5º
        fetchRequest.propertiesToFetch = ["name"]
        //6º
        let sort = NSSortDescriptor(key: "name", ascending: false)
        fetchRequest.sortDescriptors = [sort]

        return fetchRequest
    }
}

struct Home : View {
    @FetchRequest(fetchRequest: TODOItem.allTODOItem()) var items: FetchedResults<TODOItem>

    var body: some View {
        Text("Home")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...