Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование iOS/iPhone

Войти
Регистрация
Восстановить пароль
 
kievkao
42 / 42 / 2
Регистрация: 22.11.2012
Сообщений: 225
#1

Разные стеки CoreData - Программирование iOS

12.11.2015, 15:15. Просмотров 400. Ответов 0
Метки нет (Все метки)

Всем привет!

Наткнулся я недавно на статью Маркуса Зарры, где он описывает то, как он организовывает свой стек CoreData. Заинтересовало, начал искать другие статьи, и в конечном итоге вывел для себя 5 разных стеков, которые рекомендует народ.
Не по всем стопроцентно понял, почему они организованы именно так, поэтому хотел бы привести их все, свои соображения (которые, возможно, тоже кому-то пригодятся) по ним, и был бы очень рад услышать комментарии, где я ошибся..

1) Первый стек, дефолтный, который генерит сам XCode:
Main Context
|
Coordinator
|
Store

Подходит для простых проектов, где у нас пару сущностей в CoreData, и в процессе записи/чтения оттуда мы не оперируем сотнями-тысячами объектов.

2) Стек, собственно, от Маркуса Зарры:
Main Context
|
Private Context
|
Coordinator
|
Store

Подходит для таких себе Middle проектов, где запись/чтение из CoreData отнимает достаточное время, которое мешает плавной работе UI.
Непосредственно с хранилищем связан Private контекст, который педалит всю тяжеловесную работу, связанную с I/O в фоновом потоке и никому не мешает. Если мы создаем объекты, то все равно делаем это в Main Context (т.е. главном потоке), но, учитывая то, что мы за один раз никогда тонны объектов не создаем, то нас это не волнует. Так как в итоге самые длительные операции (чтение-запись) у нас выполняет Private context.

3) Стек с рабочими приватными контекстами:
Private Context, Private Context, ..., Private Context
|
Main Context
|
Private Context
|
Coordinator
|
Store

Структура похитрее. В проекте может быть создание за раз большого кол-ва объектов, запись/чтение такого же большого объема, но и одновременно с этим у нас есть где-то FetchedResultsController, через который надо в главном потоке "прогонять в онлайн-режиме" все свежезаписанные и свежепрочитанные объекты.
Получается, мы загрузили с какого-то нашего бекэнда тонну инфы, в фоновом потоке одного из верхних Private контекстов создали все нужные NSManagedObject's (что занимает длительное время) и скомандовали save().
Объекты поплыли вниз по иерархии, прошли Main Context, который подвязан к нашему FetchedResultsController, он сразу отобразил наши изменения.
Ну и после прохождения Main контекста, объекты попадают в нижний Private, где непосредственно стартует тяжеловесная запись в хранилище.

4)
Main Context, Private Context, ..., Private Context
|
Coordinator
|
Store

Вверху у нас есть один Main, и сколько угодно Private.
Если у нас есть FetchedResultsController для определенного типа данных, которые к нам приходят на запись понемного, и их надо сразу показывать при получении - мы суем их в MainContext. А также есть все остальные данные, которые приходят тоннами, но их нам юзеру прям щас показывать не надо, поэтому мы их спокойно скармливаем Private Context'у и он их спокойно в фоне пишет в хранилище.
Мы же можем подписаться на какой-нибудь NSManagedObjectContextDidSaveNotification, получать уведомление, когда эти тонны запишутся через фоновый контекст, и подбирать их не спеша в наш Main для отображения.

5)
Main Context
|
Private Context, Private Context, ..., Private Context
|
Coordinator
|
Store

Есть верхний Main контекст, у которого parent - Private, который уже, в свою очередь, присоединен к хранилищу. А также есть N отдельных Private контекстов, которые тоже имеют связь с хранилищем.
По аналогии с предыдущим вариантом у нас есть N Private контекстов, через которые мы пишем тяжеловесные данные, не требующие моментального отображения. И связка Main-Private, через которую мы работаем с данными, которые, одновременно, надо записывать в хранилище в фоне, но и вместе с тем надо прогонять через главный поток для использования в FetchedResultsController.

Добавлено через 2 минуты
Спасибо всем, кто прочитал))

Еще раз повторюсь - если кто-то заметил ошибку в моем понимании этих структур, расскажите, пожалуйста, в чем ошибка..

В частности, у меня есть сомнение по поводу того, зачем нужен промежуточный контекст в Main потоке, кроме как для того, чтобы использовать его в связке с NSFetchedResultsController'ом, который, как я понимаю, умеет работать только с Main контекстами.
Есть ли еще кейсы, когда прям никак без Main контекста не обойтись?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2015, 15:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разные стеки CoreData (Программирование iOS):

CoreData and FetchRequest - Программирование iOS
Hi, столкнулся с проблемкой... Есть БД, юзаю CoreData. В БД есть 2 поля lat,lon - тип данных double. Через визуальный редактор создал...

CoreData , наследование - Программирование iOS
Доброе время суток! Такой вопрос. У меня в модели есть объект "Person". Мне нужно составить таблицу из этих объектов, но чтобы каждый...

Редактирование CoreData - Программирование iOS
Здравствуйте. Подскажите как можно редактировать содержимое CoreData? Имеется ввиду не добавление/удаление данных из приложения, а...

Plist или coredata - Программирование iOS
Доброго времени суток! В tutorial https://www.youtube.com/watch?v=r6Cn6Kp5ghA&list=PLxqbutB-EOO0WOPOScvFeSkMO0Pw8atiu&index=10 , на 24...

Сравнения sqlite3 и coredata - Программирование iOS
Добрый день уважаемые форумчане. Расскажите пожалуйста о sqlite3 и coredata кто чем пользовался. Что вы выбираете, для каких целей что...

Насколько рационально хранение изображений в CoreData - Программирование iOS
Всем привет! Подскажите, насколько рационально хранить большие изображения напрямую в одном из аттрибутов Entity? С одной стороны...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2015, 15:15
Привет! Вот еще темы с ответами:

Покритикуйте мой метод работы с CoreData - Программирование iOS
Всем привет! Решил устроить для самообучения серию экспериментов с CoreData, и возникла идея организовать работу с этим фреймворком...

CoreData: как сохранить только одну entity из множества созданных - Программирование iOS
Добрый день! Не могу разобраться, как сделать вот что: При работе приложения на разных этапах создается несколько сущностей...

CoreData "Список пользователей" - Swift
Всем привет! Ребята, подскажите, как дополнить мою программу, чтобы пользователю, например, User1 соответствовал добавленный asset1,...

Array в CoreData - Objective-C
Добрый вечер! Как в NSManagedObject хранить массив? Там среди допустимых типов нет массива. Получается, нужно переводить массив в строку, а...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru