Создание магазина JSON для iPhone

У нас есть множество приложений, в которых мы получаем данные из удаленных веб-сервисов в виде JSON, а затем используем синтаксический анализатор для преобразования их в модель Core-Data.

Я думаю, что для одного из наших приложений нам следует сделать что-то другое.

Это приложение имеет данные только для чтения, которые являются непостоянными и поэтому не кэшируются локально очень долго. JSON глубоко иерархичен с множеством вложенных «объектов». Документы обычно содержат не более 20 элементов верхнего уровня, но могут быть до 100 КБ.

Я не думаю, что хочу создать модель Core Data с сотнями сущностей, а затем использовать картограф для импорта в нее JSON. Вроде такая песня и танец. Я думаю, что просто хочу сохранить JSON где-нибудь легко и иметь возможность запрашивать его. MongoDB было бы хорошо, если бы он работал на iPhone.

Есть ли на iPhone хранилище документов JSON, поддерживающее запросы?

Или я могу использовать парсер JSON для преобразования данных в какой-то постоянный NSDictionary и запроса, использующего предикаты?

Или, возможно, использовать SQLite в качестве хранилища больших двоичных объектов с вручную созданными индексами для структур JSON?

Или мне перестать ныть и использовать Core Data? :)

Помощь приветствуется.


person tobinharris    schedule 08.03.2011    source источник
comment
Я использую именно этот подход для приложения для iPad. MonoTouch действительно помог сделать это намного быстрее ...   -  person kwcto    schedule 08.03.2011
comment
ifwdev - ну круто, не могли бы вы объяснить поподробнее? Вы хранили капли? Почему Monotouch?   -  person tobinharris    schedule 09.03.2011


Ответы (3)


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

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

    _______________________________
    |               |              |
  2 |               |              |
    |  SQL          |  Core Data   | 4
s   |               |              |
i   |_______________ ______________|
z   |               |              |
e   |               |              |
  1 |  Collection   |  Core Data   | 3
    |  plist/xml    |              |
    |               |              |
    -------------------------------  
              Complexity--->       

К которому мы могли бы добавить третий параметр арендодателя, волатильность, то есть как часто меняются данные.

(1) Если размер, сложность и изменчивость данных низкие, то использование коллекции, например Лучшим вариантом будет NSArray, NSDictionary, NSSet сериализованного настраиваемого объекта. Коллекции должны полностью считываться в память, чтобы ограничить их эффективный размер сохраняемости. У них нет управления сложностью, и все изменения требуют перезаписи всего файла сохраняемости.

(2) Если размер очень большой, но сложность невысока, тогда SQL или другой API базы данных могут обеспечить превосходную производительность. Например. старомодная система каталожных карточек библиотеки. Каждая карта идентична, карты не связаны между собой и карты не имеют поведения. SQL или другие процедурные БД очень хороши для обработки больших объемов информации низкой сложности. Если данные простые, то SQL может эффективно обрабатывать даже очень изменчивые данные. Если пользовательский интерфейс столь же прост, то интеграция пользовательского интерфейса в объектно-ориентированный дизайн приложения iOS / MacOS сопряжена с небольшими накладными расходами.

(3) По мере того, как данные становятся более сложными, Core Data быстро становится лучше. «Управляемая» часть «управляемых объектов» управляет сложностью отношений и поведения. С коллекциями или SQL вы вручную управляете сложностью и можете быстро оказаться в затруднительном положении. Фактически, я видел людей, пытающихся управлять сложными данными с помощью SQL, которые в конечном итоге пишут свой собственный миниатюрный стек Core Data. Излишне говорить, что когда вы объединяете сложность с изменчивостью, Core Data становится еще лучше, потому что автоматически обрабатывает побочные эффекты вставки и удаления.

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

(4) Благодаря высокой сложности и большому размеру Core Data, безусловно, является лучшим выбором. Core Data сильно оптимизирован, поэтому увеличение размера графа не приводит к тому, что происходит в такой степени, как в случае с SQL. Вы также получаете очень интеллектуальное кэширование.

Кроме того, не путайте «Я хорошо понимаю SQL, но не Core Data» с «Core Data имеет высокие накладные расходы». На самом деле это не так. Даже когда Core Data - не самый дешевый способ передачи и вывода данных из хранилища, их интеграция с остальной частью API обычно дает превосходные результаты, если учитывать скорость разработки и надежность.

В данном конкретном случае из описания я не могу сказать, в каком случае вы находитесь: в случае (2) или в случае (4). Это зависит от внутренней сложности данных И сложности пользовательского интерфейса. Ты говоришь:

Я не думаю, что хочу создать модель Core Data с сотнями сущностей, а затем использовать картограф для импорта в нее JSON.

Вы имеете в виду реальные абстрактные объекты или просто управляемые объекты? Помните, что сущности относятся к управляемым объектам, а классы относятся к экземплярам. Если первое, то да, Core Data потребует много работы заранее, если второе, то этого не будет. Вы можете построить очень большие сложные графы всего с двумя или тремя связанными сущностями.

Помните также, что вы можете использовать конфигурацию для помещения разных сущностей в разные хранилища, даже если все они используют один контекст во время выполнения. Это может позволить вам поместить временную информацию в одно хранилище, использовать ее как более постоянные данные, а затем удалить хранилище, когда вы закончите с ним.

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

person TechZen    schedule 09.03.2011
comment
Спасибо за подробный ответ, хороший анализ сильных сторон Core Data. Ага, у нас есть сотни сущностей (классов), так что похоже, что Core Data потребует много работы. - person tobinharris; 10.03.2011
comment
Что ж, если у вас есть сотни логически отдельных фрагментов данных, которые требуют разного поведения, в любом случае придется много работать. Если вы используете, скажем, SQL, вам потребуются сотни таблиц для их хранения. Скорее всего, вам действительно нужна всего одна или несколько общих сущностей, которые можно использовать для создания древовидной структуры произвольной сложности. - person TechZen; 10.03.2011
comment
Спасибо. Когда вы говорите об общих объектах, вы имеете в виду хранение JSON в больших двоичных объектах в этих объектах? Поскольку извлекаемый нами JSON содержит много разных сущностей, я не уверен, что вы имеете в виду, говоря об использовании общих сущностей для создания древовидной структуры. - person tobinharris; 10.03.2011
comment
JSON имеет только несколько реальных логических объектов: объекты, массивы, значения: (stings, numbers, true, false, null). Таким образом, вам понадобится не более 7 сущностей для моделирования любой произвольно сложной структуры JSON. Если вы не понимаете, задайте другой вопрос, и я постараюсь выразить идею в другом ответе. Я почти уверен, что некоторые фреймворки JSON уже делают это. - person TechZen; 11.03.2011
comment
Кроме того, Маркус Заррус, который буквально написал книгу о Core Data, представил следующий пример того, как конвертировать JSON в Core Data и обратно, генерируя сотни сущностей на лету. Я никогда не использовал его, но он определенно дает вам представление о том, насколько легко реализовать даже самый быстрый объектный граф. stackoverflow.com/questions/2362323 / - person TechZen; 11.03.2011
comment
Ах, я понимаю, что вы говорите, имеет смысл. Спасибо! - person tobinharris; 11.03.2011

Я использую SBJson для синтаксического анализа JSON в NSDictionaries, а затем сохраняю их как файлы .plist, используя [dict writeToFile:saveFilePath atomically:YES]. Загрузка также проста NSMutableDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:saveFilePath]. Это быстро, эффективно и просто. Нет необходимости в базе данных.

person Hiltmon    schedule 08.03.2011

JSON Framework - один из них. Он превратит ваш JSON в собственные объекты NSDictionary и NSArray. Я ничего не знаю о его производительности с таким большим документом, но многим он нравится. Это не единственная библиотека JSON для iOS, но она очень популярна.

person Dan Ray    schedule 08.03.2011