간단한 data 저장하기 (UserDefualts vs Custom Plist)

간단한 data를 저장하는 방법에 대해 알아보자
1. UserDefualts : 가장 간단한 data를 간단하게 입력하는 방법이다.
2. Custom Plist : 간단한 data를 직접 생성한 Plist 파일에 저장한다. UserDefualts 보다 조금더 데이터를 나누어서 관리하고자 할 때 적합한 것 같다. 앱을 최초 생성하면 info.plist가 있는데 이런 data(NSDictionary)를 만들수 있고 그 data를 읽을 수 있다. 또는 그냥 string으로 txt 파일로 저장할 수도 있다(저장하는 파일 이름에 따라).

간단하게 코드로 살펴보면
1. UserDefualts
// Userdefualts 사용
//(1)저장할 장소
let userPath = UserDefaults.standard
// (2)data 저장
userPath.set("min", forKey: "name")
userPath.set([3,1,4], forKey: "array")
userPath.synchronize()
// (3)data 가져오기
let name = userPath.string(forKey: "name")
let array = userPath.array(forKey: "array")
cs
(1) 저장할 곳의 이름을 설정한다. 저장장소는 한곳이라 class 함수로 지정된다.
(2) 저장장소에 key값으로 data를 저장한다. 저장할 수 있는 data는 string,Int,Double,Base64 type, Bool, Array, Dictionary 등등을 저장할 수 있다. 이때 synchronize()로 동기화 하여 여러곳에서 저장할 때의 충돌을 피해야 한다.
(3) 가져오고 싶은 data type에 맞게 자료를 가져올 수 있다.

2. Custom Plist
// 파일로 저장
// (1) 저장 장소 경로 지정
let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0as NSString
let path = paths.strings(byAppendingPaths: ["data.plist"])[0]
// (2) 저장장소 경로를 통해 data를 설정
let data = NSMutableDictionary(contentsOfFile: path)
// (3) data 저장
data?.setValue("min", forKey: "name")
data?.setValue([3,1,4], forKey: "array")
data?.write(toFile: path, atomically: true)
// (4) data 읽기
let name = data?.value(forKey: "name"asString
let array = data?.value(forKey: "array"as? [Int]
cs
(1) 저장 장소를 지정한다. NSSearchPathForDirectoriesInDomains는 해당 앱과 연관된 디렉터리 정보를 반환한다. 여기서는 문서 전용 폴더를 지정하고 true로 전체 경로를 반환하였다. 이때 반환은 배열로 되나 위에서 지정한 폴더는 항상 유일하기 때문에 인덱스 0으로 처리 하였다. 반환값은 string이나 NSString으로 casting하여 파일명을 지정하게 하였다. paths.strings(byAppendingPaths:)로 동일한 폴더명에 파일명을 여러개 지정할 수 있으나 여기서는 파일명 하나로 지정하였다. 그냥 string으로 간단하게 작성할 수 있으나 NSString으로 폴더명과 파일명의 지정을 좀더 유기적으로 작성될 수 있다.
(2) 저장된 장소에 있는 파일을 읽어 parsing하여 Dictionary 객체를 생성한다. 만약 Dictionary type이 아니 자료가 저장되면 아무런 data를 읽지 못한다.
(3) key 값을 통해 여러가지 종류의 data를 저장할 수 있다. 저장되는 자료는 UserDefualts와 동일한 것 같다. 여기서 최종으로 저장을 하려면 write로 할 수 있다. 이때 atomically(아톰화???)를 true로 설정하였는데 이는 더이상 쪼갤 수 없는 실행을 의미한다. atom이 더이상 쪼갤수 없는 원자를 뜻하듯이...
이는 실행되는 동안 중단되거나 오류가 발행하면 실행하지 않은 상태로 되돌려 놓는다. 이런걸 원자적 행동이라 한다. 만약 은행에서 계좌 이체를 할 때 갑자기 정전이나 시스템이 먹통이 된다면 한쪽 은행에서 돈은 빠져나가고 다른 은행에서 받지 못하는 상황이 발생하면 안되기 때문에 특별한 알고리즘으로 이런 원자적 행동이 되도록 해야 한다.
(4) data를 읽을 때는 key값으로 읽으면 된다.

# 대량의 data를 저장하는게 아닌 간단한 data를 저장하기 위한 방법이다. 주로 UserDefualts를 더 자주 사용하고 만약 좀더 복잡하다면 Custom Plist보다는 core data와 같은 대량의 data를 저장하는 일이 더 많지 않을까 한다.














댓글

이 블로그의 인기 게시물

N-Calculator 개인정보 처리

알림창 커스터마이징 (Customizing AlertController) - I

Sudoku_GGagi 개인정보 처리방침