iOS — стратегия сохранения и сохранения результатов JSON с помощью AFNetworking

Я пишу приложение для iPhone, которое загружает данные меню из базы данных в облаке. Я использую AFNetworking (в частности, AFJSONRequestOperation) для загрузки данных в appDelegate.

До этого момента все работает нормально, но мне также нужно, чтобы приложение могло загружать меню, когда приложение находится в автономном режиме. Чтобы справиться с этим, я хочу сохранить возвращенные данные JSON на диск после их извлечения вызовом AFJSONRequestOperation.

Моя первоначальная стратегия состояла в том, чтобы сохранить возвращенный JSON в виде строки, но я не могу найти способ получить строковый ответ от AFJSONRequestOperation. Кажется глупым делать два вызова веб-службы (один для возврата объекта JSON, а другой для возврата текста), хотя это было бы просто. Я хотел бы знать, есть ли лучший или более эффективный способ сделать это. Я мог бы пропустить AFJSONRequest и перейти к простому AFHttpRequest, но тогда мне нужно было бы создать объект JSON вручную.

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


person itslittlejohn    schedule 02.03.2013    source источник


Ответы (2)


Не сохраняйте его как уровень строки JSON. AFNetworking вернет JSON либо как NSArray, либо как NSDictionary, в зависимости от вашей структуры JSON.

Вы можете просто сохранить массив или словарь в виде plist.

см. -[NSDictionary writeToURL:atomically:] или -[NSArray writeToURL:atomically:]

person Jeffery Thomas    schedule 02.03.2013
comment
Это имеет смысл для меня .. спасибо за вклад. Но зачем мне использовать writeToURL вместо writeToString? - person itslittlejohn; 02.03.2013
comment
@itslittlejohn Я не уверен, о каком методе writeToString вы говорите. В AFNetworking, NSJSONSerialization, NSDictionary или NSArray нет writeToString. - person Jeffery Thomas; 02.03.2013
comment
Извините.. Я имел в виду метод writeToFile, а не writeToString. В итоге я использовал writeToFile. - person itslittlejohn; 03.03.2013
comment
@itslittlejohn Хорошо. Да, для URL-адресов с префиксом file:/// разницы нет. Сначала я думаю о -writeToURL:atomically: в основном по привычке. - person Jeffery Thomas; 03.03.2013

Я бы попробовал NSJSONSerialization, чтобы сохранить NSData на диск.

Пример:

NSData *dataToSave =  [NSJSONSerialization dataWithJSONObject:responseObject options:nil error:nil];

id jsonObject = [NSJSONSerialization JSONObjectWithData:dataToSave options:nil error:nil];

Другой вариант — взять ваш responseObject из AFNetworking. Предположительно правильно сформированный NSDictionary и просто поместите его в NSUserDefaults для полупостоянного хранения. Вы должны убедиться, что в вашем словаре нет нулевых значений, так как NSUserDefaults плохо работает с нулевыми значениями.

person Piotr Tomasik    schedule 02.03.2013
comment
Я думал об использовании NSUserDefaults, но кажется, что значения по умолчанию лучше зарезервировать для пользовательских настроек. Как вы думаете, это лучший вариант, чем сохранение Plist? - person itslittlejohn; 02.03.2013