Приложенный массив данных SwiftUI возвращает пустой - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть объект под названием «Уроки», который состоит из:

@NSManaged public var timeMinutes: Double
@NSManaged public var id: UUID
@NSManaged public var lessonDescription: String
@NSManaged public var date: Dates

Атрибут «дата» связан с отношением «один ко многим» с отдельной сущностью «Даты», которая состоит из:

@NSManaged public var date: Date

Я сейчас пытаюсь отобразить график с суммированным значением timeMinutes по дате. Этот finalArray будет иметь следующую структуру:

struct FinalArray {
    let summedMinutes : Double
    let date : Date
}

Мой код для генерации (и отображения) этого массива выглядит следующим образом:

import SwiftUI
import SwiftUICharts

struct Test: View {
    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(fetchRequest: Lessons.allLessonsFetchRequest()) var lessons: FetchedResults<Lessons>

   var finalArray = [FinalArray]()

    init(){
        let coreDataArray = [Lessons]()
        let allKeys = Set<Date>(coreDataArray.map{$0.date.date})
        for key in allKeys {
            let sum = coreDataArray.filter({$0.date.date == key}).map({$0.timeMinutes}).reduce(0, +)
            finalArray.append(FinalArray(summedMinutes:sum, date:key))
        }
       finalArray = finalArray.sorted(by: {$0.date < $1.date})
    }

    var body: some View {
        VStack{
               LineView(data:  finalArray.map {$0.summedMinutes}, title: "This graph returns empty").padding()
               LineView(data:  lessons.map {$0.timeMinutes}, title: "This graph works").padding()
        }
    }
}

Проблема заключается в том, что finalArray ничего не возвращает, когда я запустить это? Мои основные данные не пусты; график, который отображает сопоставленные timeMinutes, заполняется. Что я делаю не так?

РЕДАКТИРОВАТЬ:

Если я добавлю простую кнопку в мой вид, который добавляет значения в FinalArray, он работает:

   Button(action: {
            self.finalArray.append(FinalArray(summedMinutes: 20, date: Date()))
                         }, label: {
                             Text("Add")
                         })

Это предполагает, что FinalArray и чтение из него диаграммы работают, но данные не могут быть извлечены из Core Data. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Исправлено, добавив его как onAppear вместо init, как показано ниже:

   @State private var finalArray = [FinalArray]()

    var body: some View {
        VStack{
               LineView(data:  finalArray.map {$0.summedMinutes}, title: "This graph returns empty").padding()
               LineView(data:  lessons.map {$0.timeMinutes}, title: "This graph works").padding()
        }
        .onAppear {
           let allKeys = Set<Date>(self.lessons{$0.date.date})
           for key in allKeys {
               let sum = self.lessons.filter({$0.date.date == key}).map({$0.timeMinutes}).reduce(0, +)
               self.finalArray.append(FinalArray(summedMinutes:sum, date:key))
           }
          self.finalArray = self.finalArray.sorted(by: {$0.date < $1.date})
       }
    }

Слава Asperi!

0 голосов
/ 18 апреля 2020

sorted (by :) возвращает элементы последовательности, отсортированные по заданному предикату. Это не сортирует на месте. Попробуйте это:

finalArray = finalArray.sorted (by: {$ 0.date <$ 1.date}) </p>

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