2017-02-20 4 views
2

У меня есть Dictionary от Json, который я хочу сохранить на UserDefaults, но я получаю ошибку Attempt to set a non-property-list object <object description here> as an NSUserDefaults/CFPreferences value for key info.Есть ли какое-либо ограничение того, какой словарь или массив я могу хранить в UserDefaults?

Дело в том, что мой Dictionary является многоуровневым гнездом Dictionary, который также имеет Array внутри. Но на листовых узлах все просто String. Это примерно такая структура.

{ 
    data: { 
     field1: "...", 
     field2: "...", 
     field3: [ 
      { 
       info1: "...", 
       info2: "...", 
       info3: "..." 
      }, 
      { 
       info1: "...", 
       info2: "...", 
       info3: "..." 
      } 
     ] 
    } 
} 

Является ли этот формат не может быть сохранен в UserDefaults?

Спасибо.

EDIT: как я сузил проблему, кажется, что проблема в отдельной строке field3. Когда я попытался сохранить словарь отдельной строки field3 ex: field3[0], он дал мне ту же ошибку. Но у меня нет проблем, если я сохраню весь json с удаленным field3 (установленным на нуль).

Вот фактическое содержание одной строки field3.

{ 
    "app_setting" = "app_setting_1"; 
    "created_at" = "2017-02-02 19:54:46"; 
    "feedback_name" = "No Toilet Paper"; 
    "feedback_option" = 1; 
    id = "feedback_option_11"; 
    property = "property_1"; 
    sn = "<null>"; 
    "updated_at" = "2017-02-02 19:54:46"; 
    "url_image_option" = "https://example.com/assets/ios/option1.png"; 
} 

ответ

3

Мы можем установить словари, неважно, что там внутри, как строка, массив.

Objective C

NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults]; 
[currentDefaults setObject:urDictionary forKey:@"yourKeyName"]; 

NSUserDefaults *retrieveDefaults = [NSUserDefaults standardUserDefaults]; 
NSDictionary *data1 = [retrieveDefaults objectForKey:@"yourKeyName"]; 

убедитесь, что это словарь первый

Чтобы преобразовать объект в NSData

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:urObject];

для извлечения объекта

NSData *data1 = [retrieveDefaults objectForKey:@"yourKeyName"]; 
urObject *retrievedModel = [NSKeyedUnarchiver unarchiveObjectWithData:data1]; 

Swift 3,0

Для преобразования словаря данных в

let dataExample: Data = NSKeyedArchiver.archivedData(withRootObject: dictionaryExample) 
NSUserDefaults.standardUserDefaults().setObject(dataExample, forKey:"yourKey") 

Для извлечения данных:

NSUserDefaults.standardUserDefaults().objectForKey("yourKey") as! NSDate 
let dictionary: Dictionary? = NSKeyedUnarchiver.unarchiveObject(with: dataExample) as! [String : Any] 

Вот что говорит яблочный

NSUserDefaul Класс ts предоставляет удобные методы для доступа к общим типам, таким как float, doubleles, integers, Booleans и URL. Объектом по умолчанию должен быть список свойств, то есть экземпляр (или для коллекций, комбинация экземпляров): NSData, NSString, NSNumber, NSDate, NSArray или NSDictionary. Если вы хотите сохранить какой-либо другой тип объекта, вы должны, как правило, архивировать его для создания экземпляра NSData.

+0

Но согласно статье здесь, вы можете сохранить словарь и массив в UserDefaults. http://www.ios-blog.co.uk/tutorials/objective-c/storing-data-with-nsuserdefaults/ И то, что я собираюсь сохранить, - это словарь, в котором внутри есть массив. –

+0

На самом деле он должен работать – Koushik

+0

ok Я получил его, U r, указав словарь, но поле 3 имеет массив словарей вида 'Any' – Koushik

0

Пока вы используете Dictionary или другие поддерживаемые типы данных, перечисленные в UserDefaults Documentation, вы должны быть хорошо. Если это так, и оно все еще дает ошибку, вы неправильно строите словарь.

Это решение работает отлично:

let dict: [String:Dictionary] = [ 
      "data": [ 
       "field1":["a","b","c"], 
       "field2":["d","e","f"] 
      ], 
      "otherData": [ 
       "field1":["g","h","i"], 
       "field2":["j","k","l"] 
      ] 
     ] 

UserDefaults.standard.set(dict, forKey: "dict") 
UserDefaults.standard.synchronize() 
+0

Является ли код, который вы отправили, именно то, что вы пытаетесь установить в качестве словаря? Обратите внимание, что 'id',' property' и 'sn' не являются строками и, следовательно, не могут быть словарными клавишами. –

+0

- это буквальный результат печати на консоль объекта, который может генерировать описание объекта, потому что это словарь. –

Смежные вопросы