Core single single manager?

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Threading

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

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

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

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

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

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

Ответ 3

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

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