Създаване на JSON магазин за iPhone

Имаме много приложения, в които извличаме данни от отдалечени уеб услуги като JSON и след това използваме анализатор, за да ги преведем в модел Core-Data.

Мисля, че трябва да направим нещо различно за едно от нашите приложения.

Това приложение има данни само за четене, които са променливи и следователно не се кешират локално за много дълго време. JSON е дълбоко йерархичен с тонове вложени „обекти“. Документите обикновено съдържат не повече от 20 елемента от най-високо ниво, но могат да бъдат до 100K.

Не мисля, че искам да създам модел на основни данни със 100 обекта и след това да използвам картограф, за да импортирам JSON в него. Изглежда като такава песен и танц. Мисля, че просто искам да запазя JSON някъде лесно и да имам възможността да го отправям заявки. MongoDB ще бъде добре, ако работи на iPhone.

Има ли хранилище за JSON документи на iPhone, което поддържа заявки?

Или мога да използвам някакъв анализатор на JSON, за да конвертирам данните в някакъв вид постоянен NSDictionary и да направя заявка, която използва предикати?

Или може би да използвате SQLite като BLOB хранилище с ръчно създадени индекси на 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 е преди всичко система за управление на обектна графика. Истинската функция е да се създаде слой на модела по време на изпълнение на моделирани приложения за дизайн Model-View-Controller. Устойчивостта всъщност е вторична и дори незадължителна функция на основните данни.

Основните проблеми при моделирането/постоянството са размерът на данните и сложността на данните. И така, относителните силни и слаби страни на всеки тип постоянство биха се разделили по следния начин:

    _______________________________
    |               |              |
  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 или други процедурни DB са много добри при обработката на големи количества информация с ниска сложност. Ако данните са прости, тогава SQL може да обработва дори силно променливи данни ефективно. Ако потребителският интерфейс е също толкова прост, тогава има малко допълнителни разходи при интегрирането на потребителския интерфейс в обектно-ориентирания дизайн на приложение за iOS/MacOS.

(3) Тъй като данните стават все по-сложни, основните данни бързо стават по-добри. „Управляваната“ част от „управляваните обекти“ управлява сложността на взаимоотношенията и поведението. С колекции или SQL вие управлявате ръчно сложността и може бързо да се окажете затрупани. Всъщност съм виждал хора, които се опитват да управляват сложни данни с SQL, които в крайна сметка пишат свой собствен миниатюрен стек от основни данни. Излишно е да казвам, че когато комбинирате сложност с променливост, Core Data е още по-добър, защото се справя автоматично със страничните ефекти от вмъквания и изтривания.

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

(4) С висока сложност и голям размер Core Data очевидно е най-добрият избор. Основните данни са силно оптимизирани, така че увеличаването на размера на графиката да не затруднява нещата толкова, колкото при SQL. Освен това получавате високо интелигентно кеширане.

Освен това не бъркайте „разбирам напълно SQL, но не и основните данни“ с „основните данни имат високи разходи“. Наистина не е така. Дори когато Core Data не е най-евтиният начин за въвеждане и извеждане на данни от постоянството, неговата интеграция с останалата част от API обикновено дава превъзходни резултати, когато вземете предвид скоростта на разработка и надеждността.

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

Не мисля, че искам да създам модел на основни данни със 100 обекта и след това да използвам картограф, за да импортирам JSON в него.

Имате предвид действителни абстрактни обекти тук или просто управлявани обекти? Не забравяйте, че обектите са за управляваните обекти, каквито са класовете за екземплярите. Ако първото, тогава да, Core Data ще бъде много работа отпред, ако второто, тогава няма да бъде. Можете да изградите много големи сложни графики само с два или три свързани обекта.

Не забравяйте също, че можете да използвате конфигурация, за да поставите различни обекти в различни хранилища, дори ако всички споделят един контекст по време на изпълнение. Това може да ви позволи да поставите временна информация в един магазин, да го използвате като по-постоянни данни и след това да изтриете магазина, когато приключите с него.

Core Data ви дава повече възможности, отколкото може да изглежда на пръв поглед.

person TechZen    schedule 09.03.2011
comment
Благодаря за подробния отговор, добра разбивка на силните страни на Core Data. Да, имаме 100 обекта (класове), така че изглежда, че Core Data ще бъде много работа. - person tobinharris; 10.03.2011
comment
Е, ако имате стотици логически отделни части от данни, всички от които изискват различно поведение, това така или иначе ще бъде много работа. Ако използвате, да речем, SQL, ще ви трябват стотици таблици, за да ги съхранявате. По-вероятно е всъщност да се нуждаете само от един или няколко генерични обекта, които можете да използвате, за да генерирате дървовидна структура с произволна сложност. - person TechZen; 10.03.2011
comment
Благодаря. Когато казвате общи обекти, имате предвид съхраняването на JSON в BLOB в тези обекти? Тъй като JSON, който извличаме, съдържа много различни обекти, не съм сигурен какво имате предвид, като използвате общи обекти за създаване на дървовидна структура. - person tobinharris; 10.03.2011
comment
JSON има само шепа реални логически обекти: Обекти, Масиви, стойности: (ужилвания, числа, истина, невярно, нула). Така че най-много ще ви трябват само 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
comment
Благодаря, знаете ли как SBJason се сравнява с code.google.com/p/json-framework? - person tobinharris; 09.03.2011
comment
Съжалявам за забавянето на отговора - това е същият код, Тобин. Просто го наричам да бъде името на главния клас. - person Hiltmon; 14.03.2011

JSON Framework е един. Той ще превърне вашия JSON в собствени обекти NSDictionary и NSArray. Не знам нищо за работата му върху голям документ като този, но много хора го използват и го харесват. Това не е единствената JSON библиотека за iOS, но е популярна.

person Dan Ray    schedule 08.03.2011