Вопрос

Я создаю приложение, которое будет использовать базовую модель данных.Я довольно новичок в Objective C, и мои обычные шаблоны проектирования на самом деле не применимы к Core Data и Objective C, по крайней мере, я не могу найти примеров, подтверждающих это.

Я просмотрел примеры разработчиков Apple и различные источники в intertubes.

Похоже, что для использования Core Data мне нужно передать managedObjectContext каждому из моих ViewControllers, заставить ViewController реализовать NSFetchedResultsControllerDelegate, а затем реализовать каждый из методов для выполнения выборки и последующей реализации

NSFetchedResultsChangeInsert

NSFetchedResultsChangeDelete NSFetchedResultsChangeMove Обновление NSFetchedResultsChangeUpdate

Это добавляет примерно 100+ строк кода в каждый ViewController, и это на 90% тот же код, который я пишу снова и снова.Кроме того, я должен передавать все по кругу и отслеживать объем занимаемой памяти.

На других языках я бы построил одноэлементную модель из нескольких классов, которые содержали методы для поддержания и доставки данных по запросу, доступные из любого места.Кажется, я не могу использовать такой подход в Objective C.Если бы я где-то создал статический класс, который взял managedObjectContext и вернул мне то, что мне было нужно, мне все равно пришлось бы передавать managedObjectContext в каждое представление, и это не было бы асинхронно, как при реализации методов делегирования, которые просто вызываются, когда результат готов.

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

Спасибо:)

Это было полезно?

Решение

Основные данные далеко не так сложны, как вы описываете.

Как правило, приложение для iPhone имеет "основной" контекст управляемого объекта, который обычно принадлежит делегату приложения.До тех пор, пока вы можете получить делегат приложения (подсказка: [[UIApplication sharedApplication] delegate]) у вас есть доступ к контексту управляемого объекта.Мне нравится определять статическую глобальную переменную для хранения ссылки на делегат моего приложения, чтобы упростить жизнь.

Как правило, существует взаимно однозначное соответствие между NSFetchedResultsController экземпляры и UITableView экземпляры.Помимо заполнения табличных представлений, чрезвычайно редко бывает, что вам понадобится NSFetchedResultsController.Если у вас есть несколько похожих представлений (напримерпанель вкладок, которая позволяет просматривать одни и те же данные по-разному, как в приложении iPod), вам следовало бы создать единый базовый класс, который настраивает NSFetchedResultsController и извлеките из этого свои конкретные контроллеры просмотра.

Теперь, когда вы создаете контроллеры представления для редактирования объекта, обычно рекомендуется делать это в отдельном контексте управляемого объекта.Если пользователь отменяет, вы просто отбрасываете контекст, и изменения исчезают.Опять же, на самом деле вам не нужен NSFetchedResultsController для этого, потому что эти представления относятся только к одному объекту.

Когда вы закончите редактирование, вы save: контекст управляемого объекта.Объекты, которые управляют вашими другими контекстами управляемых объектов, должны реализовывать NSFetchedResultsControllerDelegate методы для синхронизации представления таблицы.Опять же, это может быть реализовано в базовом классе, чтобы вы могли обобщить эту функциональность для связанных контроллеров представления.

Другие советы

Вам обязательно нужно использовать модель CoreData, или что-то с использованием NSCoder (NSArchiver, NSKeyedArchiver и т.д.) будет работать?Я обнаружил, что CoreData является излишеством для большинства приложений.

Кроме того, не могли бы вы пояснить, почему вы не можете использовать подход, использующий синглтоны?Я использовал одноэлементные фабрики в ряде приложений без проблем.Довольно легко определить методы уровня класса, которые работают с общим экземпляром (singleton).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top