Singletone Pattern

Read & Write Data

파일을 저장하는 방법에는 아래와 같이 여러가지가 있다.

이중에서도 Singletone Design Pattern으로 데이터를 저장하는 방법 중에 하나인, Plist에 대해 알아보려고 한다.

Singletone Design Pattern?

Singletone Design Pattern의 예시

class SingletonClass {

	// 최초로 접근할 때 한번만 인스턴스를 만들어냄
	static var sharedInstance: SingletonClass = SingletonClass()
	
	// init은 무조건 private으로!
	private init() { }
}




Plist

Bundle

👌🏻 01. App의 Main Bundle에 접근하기

👌🏻 02. bundle에 있는 파일 Path 가져오기

👌🏻 03. Path를 통해 객체로 변환, 데이터 불러오기

if let path = Bundle.main.path(forResource: "UserPlist", ofType: "plist"),
let dic = NSDictionary(contentsOfFile: path) as? [String:String] {
    let userDataModel = UserModel(userDic: dic)
}
if let imagePath = Bundle.main.path(forResource: "UserImage", ofType: "PNG") {
	let imgae = UIImage(contentsOfFile: imagePath)
}

Documents

👌🏻 01. NSSearchPathForDirectoriesInDomains

let path:[String] =
NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)

let basePath = path[0] + "/fileName.plist"

👌🏻 02. FileManager.default.fileExists(atPath:)

if !FileManager.default.fileExists(atPath: basePath) {
	if let fileUrl = Bundle.main.path(forResource: "fileName", ofType: "plist") {
    do {
         try FileManager.default.copyItem(atPath: fileUrl, toPath: basePath)
    } catch  {
         print("fail")
	} 
	}
}
if !FileManager.default.fileExists(atPath: basePath) {
	
	// dic은 내가 만든 어떠한 Dictionary라고 가정함
	
	let nsDic:NSDictionary =  NSDictionary(dictionary: dic)
	nsDic.write(toFile: basePath, atomically: true)
	
}

👌🏻 03. NSDictionary(contentsOfFile: basePath)

if let dict = NSDictionary(contentsOfFile: basePath) as? [String: AnyObject]
{
   // use swift dictionary as normal
}

👌🏻 04. write(toFile)

if let dict = NSDictionary(contentsOfFile: basePath) as? [String: AnyObject]
{

	// dictionary를 수정
   var loadData = dict
   loadData.updateValue("addData", forKey: "key")
	
	// dictionary를 NSDictionary로 변경 후 writeTofile 메소드를 통해 파일에 저장
	
	let nsDic:NSDictionary = NSDictionary(dictionary: loadData)
	nsDic.write(toFile: basePath, atomically: true)
}




User Defaults

👌🏻 User Defaults 활용법

👌🏻 User Defaults 클래스(NSObject) 구조




(참고) SandBox