[ios] Swift 앱에서 로컬 데이터를 저장하는 방법은 무엇입니까?

현재 Swift에서 개발 된 iOS 앱을 개발 중이며 사용자가 만든 일부 콘텐츠를 장치에 저장해야하지만 사용자 콘텐츠를 장치에 저장 / 수신하는 간단하고 빠른 방법을 찾지 못하는 것 같습니다.

누군가 로컬 저장소를 저장하고 액세스하는 방법을 설명 할 수 있습니까?

아이디어는 사용자가 작업을 실행할 때 데이터를 저장하고 앱이 시작될 때 데이터를받는 것입니다.



답변

두 개의 문자열 만 저장하는 경우 가장 간단한 해결책 NSUserDefaults은 Swift 3에서이 클래스의 이름이 just로 바뀌는 것 UserDefaults입니다.

코드의 다른 곳에서 키를 재사용 할 수 있도록 전 세계 어딘가에 키를 저장하는 것이 가장 좋습니다.

struct defaultsKeys {
    static let keyOne = "firstStringKey"
    static let keyTwo = "secondStringKey"
}

스위프트 3.0, 4.0 및 5.0

// Setting

let defaults = UserDefaults.standard
defaults.set("Some String Value", forKey: defaultsKeys.keyOne)
defaults.set("Another String Value", forKey: defaultsKeys.keyTwo)

// Getting

let defaults = UserDefaults.standard
if let stringOne = defaults.string(forKey: defaultsKeys.keyOne) {
    print(stringOne) // Some String Value
}
if let stringTwo = defaults.string(forKey: defaultsKeys.keyTwo) {
    print(stringTwo) // Another String Value
}

스위프트 2.0

// Setting

let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject("Some String Value", forKey: defaultsKeys.keyOne)
defaults.setObject("Another String Value", forKey: defaultsKeys.keyTwo)

// Getting

let defaults = NSUserDefaults.standardUserDefaults()
if let stringOne = defaults.stringForKey(defaultsKeys.keyOne) {
    print(stringOne) // Some String Value
}
if let stringTwo = defaults.stringForKey(defaultsKeys.keyTwo) {
    print(stringTwo) // Another String Value
}

사소한 구성, 플래그 또는 기본 문자열보다 더 심각한 경우에는 일종의 영구 저장소를 사용해야합니다. 현재 인기있는 옵션은 Realm 이지만 SQLite 또는 Apple 자체의 CoreData 를 사용할 수도 있습니다 .


답변

NSUserDefaults를 사용한다고 말합니다.

처음 (앱 종료 후) 데이터 스토리지를 처음 구현할 때 온라인에서 읽은 모든 내용이 NSUserDefaults를 가리 켰습니다. 그러나 사전을 저장하고 싶었지만 가능한 한 고통 스럽습니다. 나는 유형 오류를 없애려고 몇 시간을 보냈습니다.

NSUserDefaults도 기능이 제한됩니다

더 읽어 보면 NSUserDefaults의 읽기 / 쓰기가 실제로 앱이 모든 것을 읽거나 쓰지 못하게하는 방법을 보여 주었으므로 효율적이지 않습니다. 그런 다음 배열 검색이 간단하지 않다는 것을 알게되었습니다. 문자열이나 부울을 몇 개 이상 저장하면 NSUserDefaults가 이상적이지 않다는 것을 깨달았습니다.

또한 확장 할 수 없습니다. 코딩 방법을 배우고 있다면 확장 가능한 방법을 배우십시오. 기본 설정과 관련된 간단한 문자열 또는 부울을 저장하는 데 NSUserDefaults 만 사용하십시오. Core Data를 사용하여 어레이 및 기타 데이터를 저장하십시오. 작은 것부터 시작하십시오.

업데이트 : 또한 Apple Watch 지원을 추가하면 또 다른 잠재적 고려 사항이 있습니다. 이제 앱의 NSUserDefaults가 Watch Extension으로 자동 전송됩니다.

핵심 데이터 사용

그래서 Core Data가 더 어려운 솔루션이라는 경고를 무시하고 읽기 시작했습니다. 세 시간 안에 나는 그것을 작동시켰다. 테이블 배열을 Core Data에 저장하고 앱을 다시 열면 데이터를 다시로드했습니다! 튜토리얼 코드는 쉽게 적응할 수 있었고 약간의 추가 실험만으로 제목과 세부 배열을 모두 저장할 수있었습니다.

따라서 NSUserDefault 유형 문제로 어려움을 겪고 있거나 문자열을 저장하는 것 이상이 필요한이 게시물을 읽는 사람이라면 코어 데이터를 가지고 한두 시간을 소비하는 것을 고려하십시오.

내가 읽은 튜토리얼은 다음과 같습니다.

http://www.raywenderlich.com/85578/first-core-data-app-using-swift

“핵심 데이터”를 확인하지 않은 경우

앱을 만들 때 “핵심 데이터”를 확인하지 않은 경우 앱을 추가 한 후 5 분만에 추가 할 수 있습니다.

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

핵심 데이터 목록에서 삭제하는 방법

Coredata Swift에서 데이터 삭제


답변

@bploathttp://www.codingexplorer.com/nsuserdefaults-a-swift-introduction/에 대한 링크 덕분에 좋아요

기본 문자열 저장에 대한 대답이 매우 간단하다는 것을 알았습니다.

let defaults = NSUserDefaults.standardUserDefaults()

// Store
defaults.setObject("theGreatestName", forKey: "username")

// Receive
if let name = defaults.stringForKey("username")
{
    print(name)
    // Will output "theGreatestName"
}

http://ridewing.se/blog/save-local-data-in-swift/에 요약했습니다.


답변

NSCoding과 NSKeyedArchiver를 사용 하는 것은 너무 복잡 NSUserDefaults하지만 CoreData가 과도하게 사용되는 데이터에 대한 또 다른 훌륭한 옵션입니다 . 또한 파일 구조를보다 명시 적으로 관리 할 수있는 기회를 제공하므로 암호화를 사용하려는 경우 유용합니다.


답변

Swift 4.0의 경우 더 쉬워졌습니다.

let defaults = UserDefaults.standard
//Set
defaults.set(passwordTextField.text, forKey: "Password")
//Get
let myPassword = defaults.string(forKey: "Password")


답변

스위프트 3.0

세터 : 로컬 스토리지

let authtoken = "12345"
    // Userdefaults helps to store session data locally
 let defaults = UserDefaults.standard
defaults.set(authtoken, forKey: "authtoken")

 defaults.synchronize()

게터 : 로컬 스토리지

 if UserDefaults.standard.string(forKey: "authtoken") != nil {

//perform your task on success }


답변

스위프트 3

UserDefaults.standard.setValue(token, forKey: "user_auth_token")
print("\(UserDefaults.standard.value(forKey: "user_auth_token")!)")