본문 바로가기

학습 노트

(196)
197. Batch Processing with CoreData Batch Processing with CoreData CoreData에 저장하기 위해서는 Context를 생성하고, save 메서드를 호출해 context의 내용을 CoreData에 반영하는 방법으로 저장해야 한다. CoreData의 내용을 변경하기 위해서도 Context를 생성하고, CoreData의 내용을 Context에 불러온 뒤, 변경된 Context의 내용을 다시 CoreData에 반영해야 한다. 문제는 이러한 방식이 많은 양의 데이터를 처리할 수록 처리 시간과 사용하는 자원의 소모가 커진다는 데 있다. CoreData는 이러한 문제를 해결하기 위해 BatchUpdate와 BatchDelete를 제공한다. 이 기능들은 Context를 거치지 않고, 변경사항을 직접 CoreData에 반영함으로써..
196. Data Validation Data Validation Core Data에 CRUD 되는 상황에서 데이터의 무결성을 유지하기 위해 저장이나 업데이트를 시도하는 데이터의 종류나 형식에 제약을 걸 수 있다. Data Model에서 Inspector를 사용해 간단하게 검증 방식을 설정하고, NSManagedObject를 사용해 검증코드를 구현하는 방식으로 구현한다. Data Model에 검증방식 설정하기 xcdatamodeld > Person Entity > name Attribute Optional 해당 Attribute에 nil을 저장할 수 있도록 하는 속성이다. 비활성화하면 false에 해당하고 nil을 저장할 수 있고, 활성화하면 true에 해당하고 필수 nil을 저장할 수 없어 반드시 입력값이 존재해야 하는 필수 Attribu..
195. Faulting & Uniquing Faulting iOS 앱에서 DB를 사용하는 경우, 모든 경우에 저장소에 접근해 DB를 CRUD 하는 것이 아니라 Context에 불러 온 뒤 CRUD를 마치고 저장소를 업데이트 하는 방식을 사용한다. 이를 더 세분화 하면 Context에는 데이터 자체가 전달 되는 것이 아닌 정보가 전달되고, 데이터의 원본은 RowCache에 전달된다. 이후 Context에서 실제 데이터에 접근을 시도 하는 경우, Context에 존재하는 정보를 통해 RowCache의 데이터를 불러오게 된다. 이렇게 Context에 저장되는 정보를 Place Holder Object, Managed Object Fault 라고 부르며, 해당 정보를 사용해 RowCahce의 데이터를 불러 오는 과정을 Firing Faults, Fetc..
194. Transformable Transformable 영구 저장소에 저장된 데이터를 TableView에 표시한다. Contact.swift public class Contact: NSObject, NSCoding { @objc public var tel: String @objc public var fax: String @objc public var email: String init(tel: String, fax: String, email: String) { self.tel = tel self.fax = fax self.email = email super.init() } public static func sample() -> Contact { let telStr = String(format: "010-%04d-%04d", Int.ra..
선형 데이터 구조와 탐색 서론 선형 데이터 구조 자료의 순서를 유일하게 결정할 수 이쓴 구조를 말 한다. 수학적으로 n 번째 자료를 탐색한 다음 n + 1 번째로 탐색할 자료가 유일한 구조다. 시각적으로는 위와 같다. 왼쪽이 n 다음 n + 1 이 유일하므로 선형구조이고, 오른쪽이 n 다음 n + 1 이 복수이므로 비선형구조이다. 형태에서 느껴지듯 주로 리스트와 배열이 이에 해당하고, 조금 더 확장하면 위와 같이 다차원의 배열과 리스트도 선형구조에 포함된다. 본론 선형 데이터의 탐색 이러한 선형구조의 데이터를 탐색하는 방법에는 크게 두 가지 방식이 있다. 순차탐색 (Linear Search) 첫번째 자료부터 마지막 자료까지 순차적으로 탐색하는 방식으로, 최종적으로 자료의 수 만큼 탐색하게 된다. 따라서 계산량은 O(n) 이 된다..
Q1. 방 배정 하기 서론 파이썬 문법을 마무리 한 날 남은 시간 동안 문제를 한 번 풀어보기로 했다. 문제는 군 복무 중이던 시절 남는 시간에 공부라도 해보자 해서 구해뒀던 한국정보올림피아드 초등부 문제로, 지금은 주관이 바뀐 탓인지 홈페이지에서 구할 수가 없다. C언어는 1학년때 배웠었고, 입대한 건 2학년이 끝난 후였고, 공부를 시작한 건 상병이 다 돼서였으니 이미 기억의 저편으로 사라져 버린 언어에 대한 지식과 손 코딩의 한계로 딱히 제대로 건드려 볼 수가 없었다. 실제 문제 풀이는 Python으로 작성할 생각이고, 적당한 코드 리뷰 후에는 Swift로 옮겨볼 생각이다. 본론 문제 답 Egg's import math import datetime as date #initial data tot_num = 0 max_for..
Python #3 서론 이전 시간에 풀다 남은 276번 부터 290번 까지. 파일 입출력을 건너 뛰고 에러 처리에 해당하는 4문제 가량을 진행했다. 본론 276번 부터 280번 까지는 이전의 271번 부터 275번 까지 문제의 연장선이다. 따라서 이전의 코드를 개선하는 방향으로 진행했다. 문제와 조건은 다음과 같다. Account 인스턴스에 저장된 정보를 충역하는 display_info 메서드 추가할 것. 단, 잔고는 세자리마다 쉼표를 출력할 것. 입금 횟수가 5회가 될 때 잔고 기준 1%의 이자가 발생 되도록 할 것. 생성된 Account 인스턴스를 리스트에 저장할 것. 반복문을 사용해 100만원 이상인 고객의 정보를 출력할 것. 입금과 출금 내역이 기록되도록 코드를 업데이트 할 것. 각각을 출력하는 deposit_hi..
Python #2 서론 이전 시간에 각자의 페이스에 맞겨 진행했더니 Egg > Whale > Rabbit 순서대로 진도의 차이가 났다. 큰 차이는 아니었지만 이는 각자가 제대로 된 페이스 메이커의 역할을 해 주지 못한다는 이야기로. 먼저 진행하고 있던 사람이 후위의 사람의 진행을 도와줄 수는 있으나. 이 또한 선행자의 학습 흐름을 끊은 행위기에 비효율적이라 판단했다. 따라서 문제는 한 화면을 통해 공유하여 선행고 후위의 간격을 질정 수준으로 조율하고, 너무 오래 걸리는 경우 함께 답을 확인하고 코드리뷰를 하는 방식으로 진행했다. 본론 이번에 진행한 부분은 이전 시간에 이은 131번 부터로, 어차피 모든 모듈을 알 수 없으니 이후 실습하면서 하나씩 알아 가는 것으로, 함수도 유지보수 및 코드의 효율화를 위해 필요하며 이후에..
193. Fetched Result Controller Fetched Result Controller FetchedResultController는 영구 저장소에서 가져온 내용을 관리하고 표시한다. 주로 TableView와 연동할 때 사용한다. Delegate 구현을 사용해 데이터를 모니터링하고 업데이트하며, Caching을 사용해 읽기 성능을 향상할 수 있다. 이 둘의 사용 여부에 따라 3가지 모드를 사용할 수 있다. Delegate Caching No Tracking Mode ❌ ❌ Memory-Only Tracking Mode ⭕️ ❌ Full Persistent Tracking Mode ⭕️ ⭕️ No Tracking Mode 가져온 데이터를 관리하는 최소한의 역할만 수행한다. Memory-Only Tracking Mode 가져온 데이터를 관리하며, M..
192. Expression Expression Format 문자열 대신 Class로 조건을 지정할 때 사용한다. 사용 빈도는 낮지만 평균, 합계 등의 연산에서 월등히 높은 성능을 보여준다. 대신 상대적으로 구현에 필요한 코드의 양이 많고, 동작 방식이 난해하다는 단점이 있다. Table View Cell의 디자인은 위와 같고, 평균 연봉은 해당 부서의 직원 목록에 접근한 뒤 연봉 데이터에 접근해 계산을 진행한다. ExpressionViewContoller.swift > tableView(_:cellForRowAt:) func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.deq..