Шаблон для приложения Core Data iPhone - PullRequest
9 голосов
/ 24 октября 2009

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

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

Кажется, что для использования базовых данных мне нужно передать managedObjectContext каждому из моих viewControllers, заставить viewController реализовать NSFetchedResultsControllerDelegate, а затем реализовать каждый из методов для выполнения выборки и впоследствии реализовать

NSFetchedResultsChangeInsert

NSFetchedResultsChangeDelete NSFetchedResultsChangeMove NSFetchedResultsChangeUpdate

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

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

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

Спасибо:)

Ответы [ 2 ]

19 голосов
/ 24 октября 2009

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

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

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

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

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

0 голосов
/ 24 октября 2009

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

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

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