iOS (Swift): загрузка основных данных со связями - PullRequest
0 голосов
/ 01 июня 2018

Если у меня есть сущность Person и сущность Book, в которой Person может иметь много Book с.

final class Person: NSManagedObject {
    @NSManaged public fileprivate(set) var name: String
    @NSManaged public fileprivate(set) var books: Set<Book>
}

final class Book: NSManagedObject {

    @NSManaged public fileprivate(set) var name: String
    @NSManaged public fileprivate(set) var person: Person

    static func add(bookNamed name: String, to person: Person) {
        guard let context = person.managedObjectContext else { fatalError("Can not obtain managed object Context") }
        let book = NSEntityDescription.insertNewObject(forEntityName: "Book", into: context) as Book
        book.name = name
        book.person = person
    }

}

В некоторых UIViewController я добавлю несколькоBook с Person:

let alex = NSEntityDescription.insertNewObjectForEntityForName("Person", inManagedObjectContext: context) as Person
Alex.name = "Alex"
Book.add("first book", to: alex)
Book.add("second book", to: alex)
Book.add("third book", to: alex)

, а затем пару Book с другим Person

let john = NSEntityDescription.insertNewObjectForEntityForName("Person", inManagedObjectContext: context) as Person
john.name = "John"
Book.add("another first book", to: john)
Book.add("another second book", to: john)

Затем я перезагружаю свое приложение и используюзапросить запрос всех людей (например, alex и john) в табличном представлении.Затем я нажимаю alex, что приводит меня к другому контроллеру представления, у которого есть экземпляр Person, который я назначаю как alex, чтобы я мог просматривать книги, связанные с этим экземпляром.

Вопрос Все ли Book загружены в память, даже если у меня есть 1000 с?Или мне нужно выполнить другую выборку, чтобы получить Book s, принадлежащие alex, если я хочу отобразить их все?Я просто хочу немного прояснить, что происходит с отношениями между двумя сущностями, так как это меня немного смутило в последнее время.

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 01 июня 2018

CoreData использует объектную модель прокси.Когда вы выполняете запрос на выборку, он прозрачно создает все непосредственно доступные объекты как прокси.Так как они являются прокси-серверами, а не полным объектом, они фактически не загружаются из базы данных во время создания, скорее они будут загружаться из базы данных при необходимости (когда на свойства фактически ссылаются). Аналогично, они могут быть выгружены в любое время.если они не изменены и не используются.

В этом случае это означает, что ваш запрос на выборку будет создавать незагруженные прокси для каждого Person.Когда вы отображаете имя человека в первом табличном представлении, данные для этого человека будут загружены (и кэшированы) в объект прокси.В это время прокси для каждой Книги, на которую ссылается человек, будет создан как пустой прокси-объект.При последующем выборе книги и отображении сведений о книге фактические данные Книги будут извлекаться (кэшироваться) из базы данных.

Примечание: все это очень зависит от фактическогохранилище данных используется и относится только к хранилищам, таким как sqlite, которые допускают частичную загрузку.При использовании хранилища XML или plist создается весь объектный граф и загружается без пустых прокси.

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