Установить массив объектов в UserDefaults - PullRequest
0 голосов
/ 18 февраля 2019

как установить, а затем получить массив объектов json в UserDefaults?

Мое приложение падает, когда я пытаюсь установить его следующим образом:

import SwiftyJSON
var finalArray = [JSON]()

UserDefaults.standard.set(finalArray, forKey: "attemptedArray")

мои данные выглядят так:

[{
  "marked" : 3,
  "attempted" : true,
  "correct" : 3,
  "subject" : 1,
  "status" : true,
  "question" : 219,
  "answer" : 32931,
  "time" : 15,
  "score" : 5,
  "chapter" : 26
}, {
  "marked" : 4,
  "attempted" : true,
  "correct" : 4,
  "subject" : 1,
  "status" : true,
  "question" : 550,
  "answer" : 34256,
  "time" : 23,
  "score" : 10,
  "chapter" : 26
}, {
  "marked" : 1,
  "attempted" : true,
  "correct" : 1,
  "subject" : 1,
  "status" : true,
  "question" : 566,
  "answer" : 34317,
  "time" : 33,
  "score" : 14,
  "chapter" : 26
}]

Ответы [ 3 ]

0 голосов
/ 18 февраля 2019

UserDefaults не может сохранить тип SwiftyJSON JSON.Вы должны сохранить некоторый тип, который они поддерживают, в этом случае вы ищете Data.

В любом случае, для сохранения Data в UserDefaults не лучший вариант, и вы должны сохранить Data в файл в другом месте.Чтобы достичь этого, вы можете использовать FileManager.


Итак, создайте пользовательскую модель для ваших данных вместо использования JSON и перенесите Codable в свою пользовательскую модель

struct Model: Codable {
    var marked, correct, subject, question, answer, time, score, chapter: Int
    var attempted, status: Bool
}

Затем вы должны использовать этот Model как тип элемента внутри вашего массива (обратите внимание, что тогда вам нужно будет декодировать ваш ответ из Data, используя JSONDecoder (см. Ниже))

var finalArray = [Model]()

затем вы можете использовать JSONEncoder для кодирования массива моделей в Data, который вы можете записать в некоторый файл

do {
    let encoded = try JSONEncoder().encode(finalArray)
    let preferencesDirectoryURL = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first!.appendingPathComponent("Preferences", isDirectory: true)
    let fileURL = preferencesDirectoryURL.appendingPathComponent("fileName.json")
    try encoded.write(to: fileURL)
} catch { print(error) }

и JSONDecoder для декодирования Data из сохраненного файла

do {
    let preferencesDirectoryURL = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first!.appendingPathComponent("Preferences", isDirectory: true)
    let fileURL = preferencesDirectoryURL.appendingPathComponent("fileName.json")

    if let data = try? Data(contentsOf: fileURL) {
        let decoded = try JSONDecoder().decode([Model].self, from: data)
    }
} catch { print(error) }
0 голосов
/ 18 февраля 2019

Сохранение большого количества данных в настройках NSuser по умолчанию не рекомендуется по некоторым причинам:

  1. Если вы удалите некоторые ячейки массива, вам нужно будет удалить их изnsuser по умолчанию.Это будет легко, только если вы сохраните их как массив, а не как отдельные элементы.

  2. Если вы решите сохранять их как массив каждый раз, когда будете удалять или добавлять один элемент, вам потребуется сохранить все из них.Это может занять некоторое время, если массив большой

  3. Любой может получить доступ к настройкам NSuser по умолчанию.Так что это небезопасно

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

0 голосов
/ 18 февраля 2019
do{
            try let data = NSKeyedArchiver.archivedData(withRootObject: finalArray, requiringSecureCoding: false)
    UserDefaults.standard.set(data, forKey: "attemptedArray")
        }catch{
            print("Print exception here")
        }

Чтение: - Руководство по программированию списка свойств

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...