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으로 자동 전송됩니다.
핵심 데이터 사용
So I ignored the warnings about Core Data being a more difficult solution and started reading. Within three hours I had it working. I had my table array being saved in Core Data and reloading the data upon opening the app back up! The tutorial code was easy enough to adapt and I was able to have it store both title and detail arrays with only a little extra experimenting.
So for anyone reading this post who's struggling with NSUserDefault type issues or whose need is more than storing strings, consider spending an hour or two playing with core data.
Here's the tutorial I read:
http://www.raywenderlich.com/85578/first-core-data-app-using-swift
If you didn't check "Core Data"
If you didn't check "Core Data"when you created your app, you can add it after and it only takes five minutes:
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
How to Delete from Core Data Lists
Delete Data from Coredata Swift
Okey so thanks to @bploat and the link to http://www.codingexplorer.com/nsuserdefaults-a-swift-introduction/
I've found that the answer is quite simple for some basic string storage.
let defaults = NSUserDefaults.standardUserDefaults()
// Store
defaults.setObject("theGreatestName", forKey: "username")
// Receive
if let name = defaults.stringForKey("username")
{
print(name)
// Will output "theGreatestName"
}
I've summarized it here http://ridewing.se/blog/save-local-data-in-swift/
Using NSCoding and NSKeyedArchiver is another great option for data that's too complex for NSUserDefaults
, but for which CoreData would be overkill. It also gives you the opportunity to manage the file structure more explicitly, which is great if you want to use encryption.
For Swift 4.0, this got easier:
let defaults = UserDefaults.standard
//Set
defaults.set(passwordTextField.text, forKey: "Password")
//Get
let myPassword = defaults.string(forKey: "Password")
Swift 3.0
Setter :Local Storage
let authtoken = "12345"
// Userdefaults helps to store session data locally
let defaults = UserDefaults.standard
defaults.set(authtoken, forKey: "authtoken")
defaults.synchronize()
Getter:Local Storage
if UserDefaults.standard.string(forKey: "authtoken") != nil {
//perform your task on success }
For Swift 3
UserDefaults.standard.setValue(token, forKey: "user_auth_token")
print("\(UserDefaults.standard.value(forKey: "user_auth_token")!)")
For someone who'd not prefer to handle UserDefaults for some reasons, there's another option - NSKeyedArchiver & NSKeyedUnarchiver. It helps save objects into a file using archiver, and load archived file to original objects.
// To archive object,
let mutableData: NSMutableData = NSMutableData()
let archiver: NSKeyedArchiver = NSKeyedArchiver(forWritingWith: mutableData)
archiver.encode(object, forKey: key)
archiver.finishEncoding()
return mutableData.write(toFile: path, atomically: true)
// To unarchive objects,
if let data = try? Data(contentsOf: URL(fileURLWithPath: path)) {
let unarchiver = NSKeyedUnarchiver(forReadingWith: data)
let object = unarchiver.decodeObject(forKey: key)
}
I've write an simple utility to save/load objects in local storage, used sample codes above. You might want to see this. https://github.com/DragonCherry/LocalStorage
참고URL : https://stackoverflow.com/questions/28628225/how-to-save-local-data-in-a-swift-app
'Programing' 카테고리의 다른 글
조치 필터 속성에서 경로 재 지정 (0) | 2020.07.02 |
---|---|
Android Studio 프로젝트를 빌드 할 때 Stacktrace 또는 디버그 옵션을 추가하는 방법 (0) | 2020.07.02 |
Enumerable을 사용하는 것이 좋습니다. (0) | 2020.07.02 |
C #에서 매개 변수를 사용하여 저장 프로 시저를 호출하십시오. (0) | 2020.07.02 |
matplotlib에서 플롯을 업데이트하는 방법은 무엇입니까? (0) | 2020.07.01 |