Запуск объектов из NSSET - PullRequest
       51

Запуск объектов из NSSET

0 голосов
/ 22 октября 2019

Я пытаюсь запустить все объекты из имеющегося у меня NSSET, но каким-то образом он получает только один. Основываясь на моей предыдущей проблеме ( Добавление элементов по отношению ко многим ко многим )

Вот как я пытаюсь получить:

if let studentEnrolments: NSSet = student.studentEnrolments {

  for item in studentEnrolments {

     if let enrolment = item as? Enrolment, let subjectName: String = enrolment.subject?.name {

       cell.textLabel?.text = "\(subjectName)"
     }
  }
}

После этого я показываюимя объекта в ячейке из моего tableView. Для объяснения, у моего проекта есть три сущности на coremodel:

модель

Мои предметы собираются в одноэлементное приложение subjectManager, которое подает заявку, как здесь:

for subject in subjectsManager.subjects {
   enrolment.subject = subject
   student.addToStudentEnrolments(enrolment)
}

Я вижу, что каждый раз, когда я регистрирую нового ученика, он правильно добавляет предметы к ученику, но каким-то образом, когда я пытаюсь показать зарегистрированные предметы, используя первый цикл, он дважды показывает один предмет.

Это класс предметного менеджера:

import Foundation
import CoreData

    class SubjectsManager {
        static let shared = SubjectsManager()
        var subjects: [Subject] = []

        func loadSubject(with context: NSManagedObjectContext) {
            let fetchRequest: NSFetchRequest<Subject> = Subject.fetchRequest()
            let sortDescritor = NSSortDescriptor(key: "name", ascending: true)
            fetchRequest.sortDescriptors = [sortDescritor]

            do {
                subjects = try context.fetch(fetchRequest)
            } catch {
                print(error.localizedDescription)
            }
        }

        func deleteSubject(index: Int, context: NSManagedObjectContext) {
            let subject = subjects[index]
            context.delete(subject)

            do {
                try context.save()
                subjects.remove(at: index)
            } catch {
                print(error.localizedDescription)
            }
        }

        private init() {

        }
    }

И это представление, в котором я регистрирую / обновляю студентов:

import UIKit
import CoreData

class StudentsViewController: UIViewController {

    // MARK: - Outlets

    @IBOutlet weak var tfName: UITextField!
    @IBOutlet weak var tfEmail: UITextField!
    @IBOutlet weak var lbAverage: UILabel!
    @IBOutlet weak var tvSubjects: UITableView!
    @IBOutlet weak var lbTableTittle: UILabel!

    // MARK: - Variables and Constants

    var student: Student!
    var enrolment: Enrolment!
    var subjectsManager = SubjectsManager.shared
    var total: Double = 0.0
    var average: Double = 0.0

    override func viewDidLoad() {
        super.viewDidLoad()
        if let student = student {
            navigationItem.title = student.name
            tfName.text = student.name
            tfEmail.text = student.email
            lbTableTittle.text = "Subjects and grades of \(student.name!)"
            if let studentEnrolments: NSSet = student.studentEnrolments {

                for item in studentEnrolments {

                    if let enrolment = item as? Enrolment, let subjectGrade: Double = enrolment.grade {

                        total += enrolment.grade
                    }
                }
            }
            average = total / Double(subjectsManager.subjects.count)
            lbAverage.text = String(average)
        } else {
            navigationItem.title = "new student"
            lbTableTittle.text = "Non registred student"
            lbAverage.text = "Student doenst has average yet"
        }
        subjectsManager.loadSubject(with: context)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        tvSubjects.reloadData()
    }

    // MARK: - Actions

    @IBAction func addEditStudent(_ sender: UIButton) {

        if student == nil {
            student = Student(context: context)
            enrolment = Enrolment(context: context)

            for subject in subjectsManager.subjects {
                enrolment.subject = subject
                //enrolment.grade = 0.0
                student.addToStudentEnrolments(enrolment)
                print("student registred on subject: \(enrolment.subject?.name) with grade \(enrolment.grade)")
            }
        }

        student.name = tfName.text
        student.email = tfEmail.text

        do {
            try context.save()
        } catch {
            print(error.localizedDescription)
        }

        navigationController?.popViewController(animated: true)

    }

}

// MARK: - Extensions

extension StudentsViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return student != nil ? subjectsManager.subjects.count : 0
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tvSubjects.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

        if let studentEnrolments: NSSet = student.studentEnrolments {

            for item in studentEnrolments {

                if let enrolment = item as? Enrolment, let subjectName: String = enrolment.subject?.name {

                    cell.textLabel?.text = "\(subjectName)"
                }
            }
        }


        return cell
    }



extension StudentsViewController: UITableViewDelegate {
}
...