CoreData в SwiftUI: как отчетливо получить свойство? - PullRequest
0 голосов
/ 02 февраля 2020

Я трачу часы, чтобы выяснить, как однозначно извлечь значения из свойства модели данных (CoreData).

Например, если у меня есть 3 записи, в которых есть "Apple", "Banana" и «Apple» соответственно в свойстве wrappedName, ListView показывает «Apple», «Banana» и «Apple» (3 строки).

Но я хочу показать только «Apple» и «Banana» (2 ряды).

Как мне этого добиться?

//ListView.swift
import SwiftUI
import CoreData

struct ListView: View {
    @FetchRequest(entity: Data.entity(), sortDescriptors: []) var data: FetchedResults<Data>    
    var body: some View {
        NavigationView{
            List{
                ForEach(data, id: \.self) { d in
                    NavigationLink(destination: ChartView(title: d.wrappedName) {
                        Text(d.wrappedName)
                    }
                }
            }
        }
    }
}

//Data+CoreDataProperties.swift
import Foundation
import CoreData

extension Data {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Data> {
        return NSFetchRequest<Data>(entityName: "Data")
    }

    @NSManaged public var date: Date?
    @NSManaged public var id: UUID?
    @NSManaged public var name: String?
    public var wrappedName: String {
        name ?? "Unknown"
    }

}


1 Ответ

0 голосов
/ 02 февраля 2020

Пользовательский Notification, который устанавливает Published var, будет лучше

public init() {
    self.uniqueDict = [NSDictionary]()

    let notificationCenter = NotificationCenter.default
    notificationCenter.addObserver(self, selector: #selector(setUniqueDictValue), name: NSNotification.Name.NSManagedObjectContextObjectsDidChange, object: managedObjectContext)
    //set the uniqueDict variable
    setUniqueDictValue()
}

private func getEntityFetchRequest() -> NSFetchRequest<NSDictionary>
    {
        let fetchRequest = NSFetchRequest<NSDictionary>(entityName: "YourModel")

        let sortDescriptor = NSSortDescriptor(key: "name", ascending: false)

        fetchRequest.sortDescriptors = [sortDescriptor]

        fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType
        fetchRequest.propertiesToFetch = ["name"]
        fetchRequest.returnsDistinctResults = true

        return fetchRequest
    }
    ///Single Fetch of objects willSet uniqueDict variable
    func setUniqueDictValue()  {
        do {
            try self.uniqueDict = managedObjectContext.fetch(getEntityFetchRequest())
        } catch {
            fatalError("Failed to fetch entity: \(error)")
        }
    }

Пример проекта с отличными результатами https://www.youtube.com/watch?v=xl3KVmBJrSg

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...