Как записать данные в файл swift

Обновлено: 06.07.2024

В настоящее время я работаю над приложением для iOS, разработанным в Swift, и мне нужно хранить какое-то пользовательское содержимое на устройстве, но я не могу найти простой и быстрый способ хранения / получения пользовательского контента на устройстве.

Может ли кто-нибудь объяснить, как хранить и получать доступ к локальному хранилищу?

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

Привет и добро пожаловать, какие данные вы храните? Можете ли вы предоставить какой-либо код, чтобы привести пример того, что вы ищете? Спасибо. Данные, которые мне нужно хранить, в основном просто строковые данные. Поэтому для простоты мне нужно сохранить два значения String, которые я смогу получить, если пользователь перезапустит приложение.

Самое простое решение, если вы просто храните две строки, это то NSUserDefaults , что в Swift 3 этот класс был переименован в just UserDefaults .

Лучше всего хранить свои ключи где-нибудь на глобальном уровне, чтобы вы могли использовать их в другом месте своего кода.

Для чего-либо более серьезного, чем второстепенные конфигурации, флаги или базовые строки, вы должны использовать какое-то постоянное хранилище. На данный момент популярным вариантом является Realm, но вы также можете использовать SQLite или Apple, имеющие собственные CoreData .

Хороший пример. Это, вероятно, должно быть перечислением вместо структуры, хотя. Это странная реализация enum, если у вас есть только статические константы, это может быть и структура. Этот код неверен. Не используйте методы KVC setValue(_:forKey:) для сохранения данных в UserDefaults. Используйте предоставленные UserDefaults методы set(_:forKey:) (в Swift 3). Я обновил код Swift 3. Я не знаю, каким должен быть синтаксис Swift 2.

Они говорят, что используют NSUserDefaults

Когда я впервые реализовывал долгосрочное (после закрытия приложения) хранилище данных, все, что я читал в Интернете, указывало на NSUserDefaults. Тем не менее, я хотел сохранить словарь и, хотя это было возможно, это было больно. Я часами пытался заставить ошибки типа исчезнуть.

NSUserDefaults также ограничен в функции

Дальнейшее чтение показало, как чтение / запись NSUserDefaults действительно заставляет приложение читать / записывать все или ничего, все сразу, так что это не эффективно. Затем я узнал, что получение массива не так просто. Я понял, что если вы храните больше нескольких строк или логических значений, NSUserDefaults на самом деле не идеален.

Это также не масштабируется. Если вы учитесь кодировать, изучите масштабируемый способ. Используйте NSUserDefaults только для хранения простых строк или логических значений, связанных с настройками. Хранить массивы и другие данные с помощью Core Data, это не так сложно, как говорят. Просто начните с малого.

Обновление: также, если вы добавите поддержку Apple Watch, есть еще один потенциальный фактор. NSUserDefaults вашего приложения теперь автоматически отправляется на расширение Watch.

Использование основных данных

Поэтому я проигнорировал предупреждения о том, что Core Data является более сложным решением, и начал читать. Через три часа у меня все заработало. У меня был массив таблиц, сохраненный в Core Data и перезагружающий данные при открытии приложения! Код учебника был достаточно прост в адаптации, и я смог сохранить в нем как заголовки, так и подробные массивы, лишь немного поэкспериментировав.

Поэтому для тех, кто читает этот пост, кто сталкивается с проблемами типа NSUserDefault или нуждается в чем-то большем, чем хранение строк, рассмотрите возможность потратить час или два, играя с основными данными.

Вот учебник, который я прочитал:

Если вы не отметили «Основные данные»

Если вы не отметили «Основные данные» при создании приложения, вы можете добавить его позже, и это займет всего пять минут:



Когда iOS приложение устанавливается на каком-то устройстве, создается структура папок, в том числе tmp каталог для хранения временных данных. В этом уроке мы научимся управлять файлами в этом tmp каталоге, а именно создавать их, читать и удалять. Этот туториал написан на iOS 9.1 и Xcode 7.1.

Откройте Xcode и создайте Single View Application. Назовите проект SwiftFileManager. Заполните название вашей организации, идентификатор организации. Выберете языком программирования Swift и убедитесь, что в устройствах выбран iPhone.


Перейдите в Storyboard и перетащите четыре кнопки в столбик на главный экран, растяните их по ширине экрана.

Задайте произвольные цвета фону и тексту внутри кнопок.



Дайте кнопкам следующие названия:

  • Создать файл
  • Прочитать файл
  • Удалить файл
  • Посмотреть директорию

В итоге у вас должно получиться что-то вроде этого:


Теперь выделите все элементы и пройдите во вкладку "Resolve Auto Layout Issues" в правом нижнем углу (первая кнопка справа) и выберите пункт Add Missing Constraints (Добавить отсутствующие ограничения)


После того как вы это сделали вам нужно избавиться от одного ограничения, так как он портит вам внешний вид приложения. не верите? Запустите ваш проект!


Все, что вам нужно сделать, так это убрать одно ограничение и добавить другое. Выделите самый нижнее ограничение и удалите его:


Теперь у нас появилась рамка вокруг нашей кнопки. Давайте сделаем так, чтобы высота этой кнопки совпадала с высотой предыдущей кнопки?

Зажав Ctrl перетаскиваем от кнопки "Посмотреть директорию" на "Удалить файл" и отпускаем. Здесь нам нужно выбрать ограничение типа "Equal Heights".


Теперь, если вы перезапустите проект, он у вас будет выглядеть хорошо.

Теперь давайте соединим наш код со сторибордом. Нажмите на кнопку Assistant Editor и убедитесь, что в правой части располагается файл ViewController.swift. Нажмите Ctrl и перетащите из кнопки "Создать файл" в класс ViewController и создайте следующий IBAction:


Нажмите Ctrl и перетащите из "Посмотреть директорию" кнопку в класс ViewController и создайте такой IBAction.


Аналогично проделаем процедуру с двумя оставшимися кнопками:



Перейдите в файл ViewController.swift и добавьте три свойства для класса ViewController

  • Класс NSFileManager позволяет исследовать содержимое файловой системы и вносить в нее изменения
  • NSTemporaryDirectory является временным каталогом текущего пользователя
  • Файл с именем "text.txt" будет использоваться для этого туториала

Перед IBAction будет реализован вспомогательный метод checkDirectory(), который будет использоваться для проверки файлов внутри каталога:

Все файлы внутри временного каталога будут помещены в массив типа String, и этот массив будет проверяться на наличие нашего file.txt файла. Если проверка пройдет успешно, то имя файла будет возвращено, если нет - то будет возвращен nil. Далее, реализуем метод createFileBtnPressed().

Файл text.txt создается с контентом "Some Text Here" и записывается в каталог tempDir/ с методом writeToFile:atomically:encoding. Если у нас не получается с вами создать файл, то в консоль выводится ошибка.

Далее, реализуем метод viewDirectoryBtnPressed():

Мы проверяем наличие файла file.txt в каталоге через метод checkDirectory(), если у нас есть этот файл, то в directoryWithFiles присваивается возвращаемое значение метода checkDirectory(), если же файла у нас не оказывается, то в directoryWithFiles присваивается строка "Empty" . Оператор ?? это коалесцирующий nil оператор (или оператор объединяющий по nil), работает он таким образом, что когда checkDirectory() будет равен nil, то directoryWithFiles будет равен "Empty" , если же checkDirectory() не будет равен nil (то есть "file.txt" есть), то в directoryWithFiles перейдет название файла "file.txt". Значение directoryWithFiles будет выведено в консоль.

Далее, реализуем метод readFileBtnPressed():

Наконец, реализуем метод deleteFileBtnPressed():

Метод removeItemAtPath() удалит файл, если он есть. Запустите проект, выберете кнопки и посмотрите на консоль, чтобы увидеть результаты наших действий.

Этот вопрос задавался несколько раз за прошедшие годы, но в Swift 5 он снова изменился снова , особенно в двух последних бета-версиях.

Чтение файла JSON кажется довольно простым:

Но писать невероятно сложно, и все предыдущие методы, найденные на этом сайте, потерпели неудачу в Swift 5 на Xcode 11 бета-версии 5 и 6.

Как я могу записать данные в файл JSON в Swift 5?

Я попробовал эти подходы:

Не было никаких ошибок, кроме предупреждений об устаревании, и когда я их исправил, они просто не работали.

3 ответа

Давайте на секунду предположим, что у вас была какая-то случайная коллекция (либо массивы, либо словари, либо некоторая их вложенная комбинация):

Затем вы можете сохранить его как JSON в каталоге «Поддержка приложений» следующим образом:

Для обоснования того, почему мы теперь используем каталог «Поддержка приложений», а не папку «Документы», см. видео с рекомендациями по хранению iOS или обратитесь к Руководство по программированию файловой системы. Но, независимо от этого, мы используем эти папки, а не папку «связки» Приложения, которая доступна только для чтения.

И прочитать этот файл JSON:

При этом мы обычно предпочитаем использовать строго типизированные пользовательские типы, а не случайные словари, когда программисту приходится нести ответственность за то, чтобы в именах ключей не было опечаток. В любом случае, мы делаем эти пользовательские struct или class типы соответствующими Codable :

Тогда мы будем использовать JSONEncoder , а не более старый JSONSerialization :

И прочитать этот файл JSON:

Дополнительную информацию о подготовке JSON из пользовательских типов см. В кодировании и декодировании пользовательских типов статья или пример кода JSON с пользовательскими типами.

Отвечая на вопрос:

Скажем так, у меня есть некоторые данные JSON - как мне записать их в файл file.json? Это в моем каталоге проектов - это доступно для записи? А если нет, как бы я сделал это доступным для записи?

Предполагая, что «некоторый JSON» означает массив словарей как [<String, String>] , вот простой пример того, как вы можете это сделать:

Учтите, что у нас есть следующий массив, который нам нужно записать в файл в виде JSON:

Первое, что нужно сделать, это преобразовать его в JSON (как экземпляр Data ). Для этого есть более одного варианта, давайте используем JSONSerialization один:

На этом этапе вы должны увидеть на консоли:

Что наши данные отформатированы как действительный JSON.

Далее нам нужно записать это в файл. Для этого мы будем использовать FileManager как:

Обратите внимание, что файл должен существовать в каталоге документов; В приведенном выше примере его имя должно быть «MyFile.json».

В случае, если кто-то работает с пользовательскими объектами (как и я) и хочет более универсальную функцию с обобщениями

Я только начал изучать быстрые программы Apple для iOS, исходящие от android. Я в основном теперь могу читать и манипулировать быстрым кодом, а также изучать некоторые общие классы, используемые в быстром программировании iOS, но все же с некоторой путаницей с синтаксисом и всем остальным.

Я пытаюсь загрузить файл. Например, давайте просто скажем, исходя из этого URL

нажатием кнопки. Возможно, с визуальным прогрессом тоже

Через поиск здесь, в stackoverflow, я наткнулся на Alamofire. Я могу попробовать, но я не уверен, что это лучший способ для меня сделать это.

Итак, я хотел бы спросить, как и каковы мои варианты (iOS7 и iOS8) для достижения моей цели. Кроме того, плюсы и минусы были бы замечательными!

ОТВЕТЫ

Ответ 1

Вот как это использовать в вашем собственном коде:

версия Swift 3

Также обратите внимание, чтобы загружать большие файлы на диск вместо этого в память. см. `downloadTask:

Ответ 2

Здесь приведен пример, показывающий, как выполнять синхронизацию и асинхронное использование.

Здесь, как использовать его в вашем коде:

Ответ 3

Решения Devran и djunod работают до тех пор, пока ваше приложение находится на переднем плане. Если вы переключитесь на другое приложение во время загрузки, он не работает. Размер моего файла составляет около 10 МБ, и требуется некоторое время для его загрузки. Поэтому мне нужна моя функция загрузки, даже когда приложение переходит в фоновый режим.

Обратите внимание, что я включил "Фоновые режимы/Фоновая выборка" в "Возможности".

Поскольку обработчик завершения не поддерживался, решение не инкапсулировано. Извините.

И вот как позвонить --Swift 2.3 -

И вот как позвонить --Swift 3 -

Ответ 4

Если вам нужно загрузить только текстовый файл в String вы можете использовать этот простой способ, Swift 5:

Если вы хотите не необязательный результат или обработку ошибок:

Вы должны знать, что сетевые операции могут занять некоторое время, чтобы не допустить его запуска в основном потоке и блокировки вашего пользовательского интерфейса, вы можете захотеть выполнить код асинхронно, например:

Ответ 5

Вот версия Swift 4:

Ответ 6

вы хотите загрузить укус файла путем укуса и показать в процессе просмотра поэтому вы хотите попробовать этот код

использование этого кода, который вы хотите автоматически сохранить в хранилище файлов в каталоге документов в своем приложении

этот код 100% Работа

Ответ 7

Да, вы можете очень легко загружать файлы с удаленного URL. Используя этот код. Этот код работает "Прекрасно для меня".

Ответ 8

Версии Swift 4 и Swift 5, если это кому-то еще нужно

Вот как вызвать этот метод: -

Ответ 9

Попробуйте этот код только Swift 3.0 Сначала создайте файл объекта NS Скопируйте этот код в созданном файле

затем скопируйте код ниже и поместите код вместо того, чтобы скачать файл

Ответ 10

Ответ 11

Вы также можете использовать стороннюю библиотеку, которая упрощает жизнь, например Just

Ответ 12

Используйте URLSessionDownloadTask для загрузки файлов в фоновом режиме, чтобы их можно было завершить, даже если приложение завершено.

Для получения дополнительной информации см.

В нем также показано, как реализовать мониторинг выполнения для нескольких задач, выполняемых параллельно:

Ответ 13

Простой, надежный и элегантный менеджер загрузок, поддерживающий одновременные загрузки с синтаксисом закрытия для отслеживания прогресса и завершения. Написано в Swift с здесь

Чтобы записать строку в текстовый файл, выполните следующую последовательность шагов:

  1. Открыть файл в режиме записи с помощью функции open ().
  2. Записать строку в файл с помощью метода write ().
  3. Закройте файл с помощью метода close ().

Как сохранить файл в папке в iOS Swift?

Сохранить файл в каталог документов с помощью Swift

Как создать быстрый файл?

Создать модель данных

Как создать папку?

Как открыть файл с помощью Python?

Режим Описание
+ Открывает файл для обновления (чтение и запись)

Как импортировать текстовый файл в Python?

Чтобы прочитать текстовый файл в Python, выполните следующие действия:

  1. Сначала откройте текстовый файл для чтения с помощью функции open ().
  2. Во-вторых, прочтите текст из текстового файла с помощью метода file read (), readline () или readlines () объекта файла.
  3. В-третьих, закройте файл с помощью метода file close ().

Как вы импортируете данные из текстового файла в Python?

Импорт данных в Python

Что такое текстовый файл в Python?

В Python файл подразделяется на текстовый или двоичный, и разница между этими двумя типами файлов важна. Текстовые файлы структурированы как последовательность строк, где каждая строка включает последовательность символов. Это то, что вы знаете как код или синтаксис.

Попробуй поймать Свифта?

Что такое каталог документов в Swift?

Что такое файл .swift?

Насколько сложно Swift?

Как написать Hello World на Swift?

"Привет мир!" Программа на Терминале

Что такое модель в Swift?

Читайте также: