본문 바로가기

학습 노트/iOS (2021)

(96)
187. Entity Hierarchy, Relationships Entity Hierarchy Student Employee name = name age = age address = address gender = gender grade salary course 위와 같은 Data Model에서 Student와 Employee의 name, age, address, gender 4가지의 Attribute가 동일하다. 이러한 경우 양쪽에 반복해 생성하기 보다는 공용으로 사용할 수 있도록 하는 것이 효율적이다. 이러한 것을 Entity 계층이라고 부르고, CoreData는 이것을 지원한다. 위와 같이 Person으로 공통된 Attribute를 분리하는 Entity를 생성하고, 필요한 Entity에서 이를 동일하게 사용하도록 구현하면 데이터 모델 구현에 필요한 시간이 감소 데..
186. Managed Object and Managed Object Context Managed Object and Managed Object Context Core Data의 데이터 처리 단위는 관점에 따라 두 이름으로 불린다. Model 관점 Context 관점 Entity Managed Object Context 관점의 Managed Object가 이번 포스팅의 목적이다. Managed Object는 NSManagedObject로 구현 돼있고, 해당 객체의 Life Cycle을 관리하는 주체가 Core Data이기 때문에 'Managed'라는 접두어가 붙는다. NSManagedObject를 상속받아 Entity Class를 만들어 사용하게 되면, 일반적인 Core Data의 Key-Vlaue 방식식이 아닌 속성을 사용해 Attribute에 접근 할 수 있다. 이는 코드가 단순해 ..
185. CoreData CoreData 앱을 종료해도 유지될 수 있도록 데이터를 '영구'히 저장하는데 사용함. 관계형 DB아닌 DB의 사용을 돕는 것에 목적을 둠. 이에 따라 Object Graph Management Tool 이라고도 함. DB에 대한 이해가 부족해도 간편히 사용할 수 있음. 모바일 환경에 최적화 돼 있으며, iOS와 Mac OS를 아울러 사용할 수 있음. 구성요소 영구저장 (Persistent Store) : NSPersistent Atomic Store Non-atomic Store XML Binary In-Memory SQLite 데이터 처리시 모든 데이터를 메모리에 Load 필요한 부분만 Load Object Model : NSManagedObjectModel 어떤 데이터가 저장되는지, 어떤 관계를 가..
183 ~ 184. NSCoding and Codable NSCoding Apple Developer Documentation developer.apple.com 생성자와 encode(with:) 메서드를 필수로 구현해야 하는 NSCoding 프로토콜은 Archiving과 Serialization을 구현하기 위한 필수 프로토콜이다. Decoding Binary 데이터를 객체로 변환 Encoding 속성(객체)을 Binary 값으로 변환 프로토콜은 위의 두 가지를 담당하게 된다. NSCoding은 NSObject를 상속해야한다. NSCoding 프로토콜을 채용하거나 구현해야한다. 객체를 저장할 수 있다. 단, 구조체는 불가능하다. 위의 세가지 특징과 한계를 가지고 있다. init() Apple Developer Documentation developer.appl..
181 ~ 182. User Defaults and Property List User Defaults (Default Database) 특징 Key - Value의 형태 메모리가 아닌 'plist'파일로 저장 직접 수정할 수 없고 반드시 UserDefaultClass를 사용해야 함 앱 실행시 병목 해소를 위해 Cache에 Load된 후 사용됨 위의 이유로 최대 4GB 까지 사용할 수 있는 것으로 안내되지만 KB급 이상에는 부적합 즉시 사용 가능 해당 형태로 변환 필요 Bool String Data Array Dictionary Data URL NSCoding saveData() let key = "sample" @IBAction func saveData(_ sender: Any) { // UserDefaults.standard.set("Hello", forKey: key) Use..
180. File Manager #3 Slide Action deleteDictionary(), deleteFile() func deleteDirectory(at url: URL) { do { try FileManager.default.removeItem(at: url) refreshContents() } catch { print(error) } } func deleteFile(at url: URL) { do { try FileManager.default.removeItem(at: url) refreshContents() } catch { print(error) } } 두 메서드는 같은 방식으로 구현된다. 대상 삭제 removeItem(at:) Apple Developer Documentation developer.apple.com 해당 메..
179. File Manager #2 Directory 추가 func addDirectory(named: String) { guard let url = currentDirectoryUrl?.appendingPathComponent(named, isDirectory: true) else { return } do { try FileManager.default.createDirectory(at: url, withIntermediateDirectories: true, attributes: nil) refreshContents() } catch { print(error) } } URL 추가 현재의 Directory URL을 받아와 appendingPathComponent 메서드를 사용해 새로운 경로를 생성한다. appendingPathComponen..
178. File Manager #1 class FileManagerTableViewController: UITableViewController { var currentDirectoryUrl: URL? var contents = [Content]() var formatter: ByteCountFormatter = { let f = ByteCountFormatter() f.isAdaptive = true f.includesUnit = true return f }() currentDirectoryUrl의 형식은 URL이다. iOS에 경로는 URL 구조체로 표현한다. 만약 클래스로 서치하고자 한다면 NSURL 클래스를 사용한다. 이 둘은 파일과 네트워크 URL을 모두 표현할 수 있고, 이를 조작하기 위한 속성과 메서드를 제공한다. currentD..
177. Data Persistence Overview Data Persistence Overview (데이터 영구 저장) iOS에서 지원하는 저장 방식은 다음과 같다. User Default Property List Keychain Core Data Binary Data 설정값등의 간단한 데이터는 User Default와 Property List를 사용한다. 작은 크기의 데이터를 쉽고 빠르게 쓰고, 접근할 수 있다. 단, Query를 지원하지 않기 때문에 데이터의 검색이 쉽지 않다. 암호등의 민감한 정보는 Keychain을 사용한다. 다수의 데이터를 저장할 때는 Core Data를 사용한다. 모든 데이터를 객체로 관리하기 때문에 검색과 정렬이 용이하고, 일부 데이터에만 접근하는 것도 가능하기 때문에 파일 크기가 성능에 큰 영향을 주지 않는다. Binary ..
176. GCD in Action GCD in Action // // ImageFilterViewController.swift // Concurrency Practice // // Created by Martin.Q on 2021/12/23. // import UIKit class ImageFilterViewController: UIViewController { @IBOutlet weak var collectionView: UICollectionView! var isCancelled = false @IBAction func start(_ sender: Any) { PhotoDataSource.shared.reset() collectionView.reloadData() isCancelled = false } @IBAction func ca..