MVC - NSFetchRequest в файле модели без UIKit

ios swift

56 просмотра

1 ответ

В моем ViewController у меня есть функция для извлечения всех 'headingNumbers' (атрибут сущности 'Vocabulary'). Я понял, что это не очень хорошая практика MVC.

Поэтому я создал новый файл swift. Я не импортировал UIKit. Youtube Stanford - Разработка приложений для iOS 9 с помощью Swift - 2, 22:53: «Никогда не импортируйте UI KIT в файл модели, потому что модель независима от UI»
( https://www.youtube.com/watch?v=j50mPzDMWVQ )

Однако теперь я получаю такие сообщения, как «Использование неразрешенного идентификатора« UIApplication »». Что имеет смысл, так как я не импортировал UIKit. Вопрос в том, как мне теперь выполнить запрос на выборку в моем новом файле swift.
(Как вы, наверное, сейчас, я новичок)

import Foundation
import CoreData

class QueryData {

private var selectedHeadingNumber:String = "-123456789"
private var setOfHeadingNumbers:[String] = [String]()

func getHeadingNumbers2() -> [String] {


    if let managedObjectContext = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext {

        // Create Fetch Request
        let fetchRequest = NSFetchRequest(entityName: "Vocabulary")

        // Add Sort Descriptor
        let sortDescriptor = NSSortDescriptor(key: "headingNumber", ascending: true)
        fetchRequest.sortDescriptors = [sortDescriptor]

        // Execute Fetch Request
        do {
            let result = try managedObjectContext.executeFetchRequest(fetchRequest)

            for managedObject in result {
                if let foundHeadingNumber = managedObject.valueForKey("headingNumber") {

                    if let result_number = foundHeadingNumber as? NSNumber
                    {
                        let result_string = "\(result_number)"

                        if !setOfHeadingNumbers.contains(result_string) {
                            print("Headingnumber: \(foundHeadingNumber) ")
                            setOfHeadingNumbers.append(result_string)

                            print("updated selectedHeadingNumber: ", selectedHeadingNumber)
                            selectedHeadingNumber = result_string

                            // set the default lessonnumber to the first lesson
                            if selectedHeadingNumber == "-123456789" {
                                selectedHeadingNumber = result_string
                                print("updated selectedHeadingNumber: ", selectedHeadingNumber)
                            }
                        }

                    }

                    //setOfHeadingNumbers.append(first)
                }
            }

        } catch {
            let fetchError = error as NSError
            print(fetchError)
        }

    } // end of if statement

    return setOfHeadingNumbers

} // end of func

} // end of class
Автор: Robert Источник Размещён: 08.11.2019 11:02

Ответы (1)


1 плюс

То , что вы на самом деле нужно NSManagedObjectContex. Передайте это как аргумент методу:

func getHeadingNumbers2(inContext context: NSManagedObjectContext) -> [String]
{
    ...
}

Или внедрите это как зависимость в инициализаторе

class QueryData
{
    let context: NSManagedObjectContext

    init(context: NSManagedObjectContext)
    {
        self.context = context
    }

    func getHeadingNumbers2() -> [String]
    {
        let fetchRequest = NSFetchRequest(entityName: "Vocabulary")
        let result = try self.context.executeFetchRequest(fetchRequest)
        ...
    }
}
Автор: Kubba Размещён: 20.08.2016 09:11
Вопросы из категории :
32x32