Менеджер синглтонов Core Data? - PullRequest
16 голосов
/ 14 июня 2011

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

Ответы [ 3 ]

15 голосов
/ 14 июня 2011

При принятии решения о том, подходит ли вам синглтон, нужно учитывать два важных момента (обратите внимание, что это не единственные два):

  1. Потоки
  2. Использование памяти

Потоки

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

[[CDSingleton managedObjectContext] executeFetchRequest:someFetch];
//later on a background thread you might write
NSManagedObject *object = [[CDSingleton managedObjectContext] objectWithID:objectID];

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

Использование памяти

Синглтоны никогда не исчезают,в этом смысл синглтона.Таким образом, они также никогда добровольно не освобождают свои потребляемые ресурсы.В случае CoreData это означает, что контекст управляемого объекта будет продолжать хранить управляемые объекты в памяти, пока вы не вызовете -reset или -save:.

Это может быть плохо, если ваше приложение использует много данных.

15 голосов
/ 14 июня 2011

Стандартный код в делегате приложения в шаблонах Xcode функционально реализован как одноэлементный. Объект приложения является одноэлементным, и он поддерживает только один объект делегата, так что у вас есть только один экземпляр стека базовых данных, и, поскольку объект приложения является универсально доступным, вы всегда можете также получить делегат приложения.

Однако даже это работает только для простых приложений с одним постоянным хранилищем со всем контекстом, использующим это одно хранилище. В более сложных приложениях у вас может быть несколько магазинов или контекст, поэтому синглтон быстро становится слишком раздутым.

Синглтон, как правило, не дает вам больших сложностей, скрывая или сохраняя дублирующееся кодирование, потому что большая часть кодирования, которое вы должны делать с Базовыми данными, находится на уровне контроллера, где вы связываете модель с представлением / интерфейсом. Так как эта логика обычно является индивидуальной для каждого представления, вы фактически не можете оставить ее в синглтоне.

В прошлом я использовал синглтоны, но в итоге они обычно доставляют больше хлопот, чем стоят.

2 голосов
/ 05 июля 2012

Рекомендуется передавать контекст управляемого объекта между контроллерами представления. Документация Apple и образцы делают это. Вы никогда не должны иметь доступа к своему делегату приложения, ни к Базовым данным, ни к чему-либо.

http://www.cimgf.com/2011/01/07/passing-around-a-nsmanagedobjectcontext-on-the-iphone/

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