Тема отличная. В рунете про Core Data написано очень и очень мало. Сам начинал читать эту книгу на английском, потом как-то забросил. Думаю, на русском будет куда проще воспринимать теоретическую информацию. Всячески поддерживаю перевод следующих разделов.
Благодарю за отзыв.
Я по-правде хочу не просто переводить, но и добавлять нечто интересное вроде «Знаете ли Вы?» и практической части. Хотелось бы сделать такой большой и полезный туториал по Core Data.
Спасибо! Всегда приятно слышать, что твои труды кому-то нужны и работа проделана не в пустую.
P.S. Был заблокирован модератором до 25, думал блок снимут 25 и опубликовал в этот день, но увы… пост провисел в песочнице весь день, а потом магическим образом исчез, хотя я думал он будет автоматически опубликован. Благо я сохранил исходный код статьи.
А в core data вообще много всего работает мутно и неочевидно. Плата за универсальность. Я не фанат, но по долгу службы использовать приходилось, и довольно много.
Почему? Мне кажется это вполне логичным. Если попробуете в консоль вывести NSManagedObject, внутри которого будет ссылка на самого себя, вы же не ожидаете от компилятора бесконченого цикла вывода текста в консоль?
Как вам такой глюк: при обращении к свойству объекта если он fault, получаем nil, а иногда не nil а то, что нужно. Происходит абсолютно рандомно. Потратил несколько ночей чтобы найти костыль.
Ну если использовать оба контекста только через performBlock: и performBlockAndWait: (ну да, UI-контекст можно просто использовать в UI-потоке), проблем не должно быть. Можете поподробнее рассказать суть проблемы?
Проблема такая (насколько помню по памяти, в исходнике искать долго):
Имеется такая иерархия Relationships где Conversations > Messages > User > Comments. То есть, крайняя сущность — это список комментариев пользователя. Приложение открывается по push-уведомлению и, если приложение было в фоне и получало didReceiveMemoryWarning, то при открытии окна с комментариями из профиля пользователя сразу после запуска приложения иногда возникал сплошной (null) (null) (null) вместо текста на контролах. Видимо, Core Data не успевал подгрузить свои внутренности.
Решил проблему так: использовал dispatch_async с задержкой 0.3 секунды (установлено эмпирическим путем). Вот такой некрасивый костыль.
Кстати, по поводу GCD у меня есть отличная книга, которую я всю перевел (а потом по глупости удалил с блогспота всё, может в кэше гугла что-то и осталось еще).
Если желаете, то могу после этой (Core Data) книги вновь перевести «Pro Multithreading...». А если хотите сами почитать — напишите в личку и я вышлю вам её в pdf формате.
In general, you should use the highest level of abstraction that suits your needs. This means that you should usually use NSOperationQueue instead of GCD, unless you need to do something that NSOperationQueue doesn't support.
Извините за английский, но думаю вы его знаете неплохо. Предполагаю, что это так потому что код более читаем, и блоками же можно добавлять операции, почти как GCD получается.
на самом деле GCD может много, чего не может NSOperation, а NSOperation умеет отмену и приоритеты. Так что все зависит от задачи, нельзя так однозначно говорить.
Они и не говорят однозначно, они говорят ровно следующее — используйте NSOperation там, где можно использовать NSOperation, в остальных случаях используйте GCD напрямую.
Ну примерно как используйте Core Data для работы с базой, используйте чистый SQLite только там где это необходимо.
Это же очень прозрачно работает. Наверное единственное когда вам придется об этом задуматься это при использовании transient properties, а так же в случаях когда столкнетесь с необходимостью prefetching. Советую посмотреть видео WWDC начиная с 2010 года, касательно core data.
И Вам спасибо за отзыв!
Могу сказать одно — будет еще много чего и главное будет интересно (я постараюсь, чтобы так было), поэтому открыт любым пожеланиям по формату подачу информации, по каким-то рубрикам вроде «Знаете ли Вы?» (кстати решил сам добавить, не знаю насколько удалось и насколько вписывается сюда, интересно было бы услышать по этому поводу комментарии) и практическим заданиям, которые будут в ближайшее время.
Core Data для iOS. Глава №1. Теоретическая часть