본문 바로가기

IOS/러닝패스

[#C2 SWIFT3]내 IOS 앱에서 기기에 데이터를 저장하는 방법

SWIFT에서 기기에 사용자의 DATA를 저장하는 방법은 두 가지가 존재합니다.


- UserDefaults


- TextFile



(1) UserDefaults


모든 앱에서는 데이터를 읽고 쓸 수 있는 각자의 샌드 박스 영역이 존재합니다. 이 영역에는 다음과 같이 딕셔너리 오브젝트를 얻어 접근할 수 있습니다.

이 오브젝트는 한 개의 앱에서 공통으로 1개만 만들 수 있습니다.



1
let defaults = UserDefaults.standard
cs

 


이는 다음과 같이 데이터를 저장하고 읽어올 수 있습니다. 여기서 dataString 형식이라고 가정합니다.


저장


1
defaults.set( data, forKey: "key" )
cs



읽기


1
let value = defaults.String( forKey: "key" )
cs




(2) TextFile

 

만약 String이 긴 문장인 경우, UserDefaults로 저장하기에는 부담스러울 수 있습니다. 이런 경우에는 String을 TextFile에 저장하고, 불러올 수 있습니다.



기본적인 구조


NSHomeDirectory() 메소드를 이용해 앱이 이용할 수 있는 홈 디렉터리를 구한다 -> 그 아래에 저장에 사용할 파일 경로를 연결 -> 텍스트 파일 형태로 저장


1
let path = NSHomeDirectory() + "/Documents/textFile.txt"
cs


path 변수는 파일의 경로를 지정합니다. 이는 앱이 이용할 수 있는 홈 디렉터리 하위에 Documents 폴더를 생성한 후 textFile.txt 형태로 저장하겠다는 뜻입니다.


저장


1
2
3
4
5
6
7
8
9
10
11
let data = textView.text //String
 
do {
 
try data?.write( toFile: pathatomicallytrue, encoding: String.Encoding.utf8 )
 
catch let error as NSError {
 
  pirnt("save failed \n \(error)")
 
}
cs


읽기


1
2
3
4
5
6
7
8
9
do {
 
let data = try String( contentsOfFile: path, encoding: String.Encoding.utf8 )
 
catch let error as NSError {
 
  pirnt("read failed \n \(error)")
 
}
cs



해당 과정에서 실패할 경우를 대비해 오류 처리(예외 처리)를 해야합니다. atomically 속성은 TRUE로 설정할 경우 데이터 저장 중 비정상적으로 종료되었을때 파일이 깨지지 않게 임시 파일을 사용해 데이터를 저장합니다.



TIP . 파일 존재 여부 검사


1
2
3
4
5
6
7
let fileManager = FileManager.default
 
guard ( fileManager.fileExists( atPath: path )==true ) else {
 
  retrun
 
}
cs