Atualmente, estou trabalhando em um aplicativo iOS desenvolvido no Swift e preciso armazenar algum conteúdo criado pelo usuário no dispositivo, mas não consigo encontrar uma maneira simples e rápida de armazenar / receber o conteúdo dos usuários no dispositivo.
Alguém poderia explicar como armazenar e acessar o armazenamento local?
A ideia é armazenar os dados quando o usuário executa uma ação e recebê-los quando o aplicativo é iniciado.
ios
swift
nsuserdefaults
Nicklas Ridewing
fonte
fonte
Respostas:
A solução mais simples se você estiver armazenando apenas duas strings é que
NSUserDefaults
, no Swift 3, essa classe foi renomeada para justUserDefaults
.É melhor armazenar suas chaves em algum lugar do mundo para que você possa reutilizá-las em outro lugar no seu código.
Swift 3.0, 4.0 e 5.0
Swift 2.0
Para algo mais sério do que pequenas configurações, sinalizadores ou seqüências de base, você deve usar algum tipo de armazenamento persistente - Uma opção popular no momento é o Domínio, mas você também pode usar o SQLite ou o Apples CoreData .
fonte
setValue(_:forKey:)
para salvar dados em UserDefaults. Use osUserDefaults
métodos fornecidosset(_:forKey:)
em (no Swift 3).Eles dizem usar NSUserDefaults
Quando eu estava implementando o armazenamento de dados de longo prazo (após o fechamento do aplicativo) pela primeira vez, tudo o que eu li on-line me indicou o NSUserDefaults. No entanto, eu queria armazenar um dicionário e, embora possível, estava provando ser uma dor. Passei horas tentando obter erros de tipo para desaparecer.
NSUserDefaults também é limitado em função
Outras leituras revelaram como a leitura / gravação de NSUserDefaults realmente força o aplicativo a ler / gravar tudo ou nada, tudo de uma vez, para que não seja eficiente. Aprendi então que recuperar uma matriz não é simples. Percebi que se você está armazenando mais do que algumas seqüências de caracteres ou booleanos, o NSUserDefaults realmente não é o ideal.
Também não é escalável. Se você estiver aprendendo a codificar, aprenda da maneira escalável. Use apenas NSUserDefaults para armazenar cadeias simples ou booleanos relacionados a preferências. Armazene matrizes e outros dados usando o Core Data, não é tão difícil quanto eles dizem. Apenas comece pequeno.
Atualização: Além disso, se você adicionar o suporte do Apple Watch, há outra consideração em potencial. Agora, os NSUserDefaults do seu aplicativo são enviados automaticamente para a extensão Watch.
Usando dados principais
Portanto, ignorei os avisos sobre o Core Data como uma solução mais difícil e comecei a ler. Dentro de três horas eu estava trabalhando. Eu tive minha matriz de tabelas sendo salva no Core Data e recarregando os dados ao abrir o aplicativo novamente! O código do tutorial foi fácil de adaptar e eu consegui armazenar as matrizes de título e detalhe com apenas um pouco de experiência extra.
Portanto, para qualquer pessoa que esteja lendo esta postagem que esteja enfrentando problemas do tipo NSUserDefault ou cuja necessidade seja mais do que armazenar strings, considere passar uma ou duas horas jogando com os dados principais.
Aqui está o tutorial que eu li:
http://www.raywenderlich.com/85578/first-core-data-app-using-swift
Se você não marcou "Dados Principais"
Se você não marcou "Dados Principais" ao criar seu aplicativo, pode adicioná-lo depois e leva apenas cinco minutos:
http://craig24.com/2014/12/how-to-add-core-data-to-an-existing-swift-project-in-xcode/
http://blog.zeityer.com/post/119012600864/adding-core-data-to-an-existing-swift-project
Como excluir das listas de dados principais
Excluir dados do Coredata Swift
fonte
Okey, então obrigado a @bploat e o link para http://www.codingexplorer.com/nsuserdefaults-a-swift-introduction/
Descobri que a resposta é bastante simples para algum armazenamento básico de strings.
Eu o resumi aqui http://ridewing.se/blog/save-local-data-in-swift/
fonte
Usar NSCoding e NSKeyedArchiver é outra ótima opção para dados complexos demais
NSUserDefaults
, mas para os quais CoreData seria um exagero. Também oferece a oportunidade de gerenciar a estrutura de arquivos de forma mais explícita, o que é ótimo se você deseja usar a criptografia.fonte
Para o Swift 4.0, isso ficou mais fácil:
fonte
Swift 3.0
Setter: armazenamento local
Getter: armazenamento local
fonte
Para Swift 3
fonte
Para alguém que não prefere lidar com os UserDefault por alguns motivos, há outra opção - NSKeyedArchiver e NSKeyedUnarchiver. Ajuda a salvar objetos em um arquivo usando o arquivador e a carregar arquivos arquivados em objetos originais.
Eu escrevi um utilitário simples para salvar / carregar objetos no armazenamento local, usei os códigos de amostra acima. Você pode querer ver isso. https://github.com/DragonCherry/LocalStorage
fonte
Swift 5+
Nenhuma das respostas realmente cobre em detalhes o padrão construído nos recursos de armazenamento local. Pode fazer muito mais do que apenas strings.
Você tem as seguintes opções diretamente da documentação da apple para 'obter' dados dos padrões.
Aqui estão as opções para 'configuração'
Se estiver armazenando coisas como preferências e não dados grandes conjunto de , essas são opções perfeitamente perfeitas.
Exemplo duplo :
Configuração:
Obtendo:
O interessante de um dos getters é o dictionaryRepresentation , esse útil getter pega todos os seus tipos de dados, independentemente do que sejam, e os coloca em um bom dicionário que você pode acessar por seu nome de string e fornecer o tipo de dados correspondente correto quando você solicitar de volta, uma vez que é do tipo 'qualquer' .
Você pode armazenar suas próprias classes e objetos também usando os
func set(Any?, forKey: String)
botõesfunc object(forKey: String) -> Any?
setter e getter de acordo.Espero que isso esclareça mais o poder da classe UserDefaults para armazenar dados locais.
Na nota de quanto você deve armazenar e com que frequência, Hardy_Germany deu uma boa resposta sobre isso neste post , aqui está uma citação dele
Outra coisa a ser observada, conforme mencionado pelo usuário Mohammad Reza Farahani desta postagem, é a natureza assíncrona e síncrona dos userDefaults.
Por exemplo, se você salvar e fechar rapidamente o programa, poderá notar que ele não salva os resultados, isso ocorre porque ele persiste de forma assíncrona. Você pode não perceber isso o tempo todo; portanto, se você planeja salvar antes de sair do programa, pode dar uma olhada nisso, dando-lhe algum tempo para concluir.
Talvez alguém tenha algumas soluções legais para isso que possam compartilhar nos comentários?
fonte
NsUserDefaults salva apenas tamanhos variáveis pequenos. Se você deseja salvar muitos objetos, pode usar o CoreData como uma solução nativa ou criei uma biblioteca que ajuda a salvar objetos tão facilmente quanto a função .save (). É baseado em SQLite.
SundeedQLite
Confira e me conte seus comentários
fonte