Как правильно хранить / извлекать пользовательские данные (файлы чтения / записи) в iPhone (iOS) dev с помощью Swift? - PullRequest
0 голосов
/ 04 мая 2020

Фон

Я написал одно конкретное приложение через Windows Формы (C#), Android (Java и Kotlin), HTML5 Веб-приложение, Electron JS (работает на Linux, Ma c и Win10) и даже в качестве приложения UWP (универсальная Windows платформа).

Все для использования JSON Файл для данных

Все эти приложения используют одни и те же данные в формате JSON для пользовательских настроек. Это означает, что я могу обмениваться данными на всех платформах через один и тот же файл и формат файла. На Android есть дополнительное преимущество сохранения файла в UserPrefs (который обеспечивает безопасность и резервное копирование для пользователя).

Проблема Я также написал приложение как Приложение для iPhone / iPad (Swift), однако я не могу найти правильный способ обработки файлового хранилища JSON.
Проблема , а не , связанная с десериализацией JSON в мой бизнес-объект , Это все работает отлично. Тем не менее, я не уверен в следующем:

  1. где должны храниться файлы в системе iPhone / iPad?
  2. Вы можете сохранить файл в какой-либо папке с пользовательскими настройками или местоположением приложения?
  3. Как открыть файл для чтения / записи и чтения / записи данных? (Swift)
  4. Как я могу лучше понять пути, доступные для чтения и записи файлов?

Я искал во всем, чтобы найти этот ответ. Можете ли вы указать мне официальную документацию, книгу, элемент StackOverflow или что-то, что объясняет это ясно? (Надеюсь, с примерами Swift.)

1 Ответ

2 голосов
/ 04 мая 2020

См. iOS Рекомендации по хранению видео и Основы файловой системы . Это должно помочь вам.

Короче говоря, данные приложения обычно хранятся в «каталоге поддержки приложений», документы, предоставляемые пользователю (например, приложение «Файлы»), хранятся в папке «документы», загрузки могут быть легко восстанавливаемые данные хранятся в папке «caches». Технически вы можете использовать UserDefaults для хранения данных приложения такого рода, но на самом деле это не предназначено для этой цели.

Повторное открытие файла для «чтения / записи», когда имея дело с JSON, вы обычно этого не делаете. Вы читаете файл в Data и десериализуете JSON в объекты вашей модели.

do {
    let fileURL = try FileManager.default
        .url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
        .appendingPathComponent("appdata.json")

    let data = try Data(contentsOf: fileURL)
    let appData = try JSONDecoder().decode(AppData.self, from: data)
    // do something with appData
} catch { 
    print(error)
}

Когда вы хотите обновить, вы сериализуете объекты модели в Data, содержащий ваш JSON, а затем записываете его в файл, заменяя файл.

do {
    let fileURL = try FileManager.default
        .url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
        .appendingPathComponent("appdata.json")

    let data = try JSONEncoder().encode(appData)
    try data.write(to: fileURL)
} catch { 
    print(error)
}

Очевидно, это предполагает, что тип AppData (или как вы его называете) соответствует Codable, но вы сказали, что знакомы с сериализацией JSON. См. Кодирование и декодирование пользовательских типов для получения дополнительной информации.

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