본문 바로가기

2022/06

(8)
200. Performance & Debugging Performance & debugging CoreData이 우수한 성능 덕분에 대부분의 개발자나 사용자의 요청을 처리하는 데에는 문제가 없다. Predicate가 난해한 경우 너무 많은 데이터를 불러오는 경우 Faults를 너무 자주 발생하는 경우 위의 세 경우를 감안해 요청을 생성한다면, CoreData의 데이터 처리에 필요한 시간을 획기적으로 개선할 수 있다. CoreData Debugging CoreData가 어느 부분에서 부하가 높은지 확인하기 위해서는 Xcode의 Scheme과 Instrument를 사용한다. Scheme Xcode의 상단에는 현재 프로젝트의 상태를 표시하는 공간이 존재한다. 여기서 프로젝트 이름을 누르면 위와 같은 팝업창이 표시되는데, 여기서 Edit Scheme을 선택해 L..
199. Context Synchronization Context Synchronization Context는 각자가 개별적으로 동작하므로, 동일한 Entity를 복수의 Context가 각자 처리하는 경우 데이터 무결성의 문제가 생긴다. 이러한 문제는 실제 값을 변경하게 되는 업데이트와 저장에서 더욱 두드러진다. 따라서 어떤 데이터를 적용할 건지, 옳은 데이터인지 판단할 Merge 정책이 필요하다. Main Context와 Background Context에서 같은 Entity의 같은 데이터에 접근한 뒤, Fetch, Update, Save를 진행해 차이를 확인하고, 동기화를 구현한다. SyncAndMergeViewController>fetchIntoMainContext() @IBAction func fetchIntoMainContext(_ sender:..
Stack #2 서론 이전에 정리했던 Stack의 구조와 동작 방식을 이해하고, 문제를 풀며 이를 응용해 본다. 본론 Q1 스택에 push 되는 값들이 오름차 수열이 되는지를 판단해, 불가하면 'NO'를 가능하다면 작업의 순서를 push는 '+'로 pop은 '-'로 출력하도록 하면 된다. Q1_Python Stack class Stack2(): class Empty(Exception): pass def __init__(self): self.stk = [] def is_empty(self) -> bool: return not self.stk def push(self, val): self.stk.append(val) def pop(self): if self.is_empty(): raise Stack2.Empty return..
애플 밀레니즈 루프 (진품 구별법 / 스페이스 블랙 + 실버) 서론 운동용으로 산 워치에 줄질이 웬 말이냐며 하지 않겠노라고 다짐한 나는 어딜 가고, 슬슬 올라가는 기온, 늘어가는 땀과 함께 밀레니즈 루프에 대한 관심이 늘어만 갔다. 어쩌다 보니 밀레니즈 루프 거래만 두 번을 진행했고, 한 번은 가품이었던 희한한 경험을 했는데, 이렇게 된 김에 둘이 어떤 차이가 있는지 비교라도 해 보려고 한다. 본론 물론 두 번의 거래가 모두 정상이라고는 말하지 않았다. 첫 번째 거래는 '스페이스 블랙 밀레니즈 루프'가 가품이었고, 두 번째 거래는 '그라파이트 밀레니즈 루프'가 '스페이스 블랙 밀레니즈 루프'였다. 결론적으로 내가 찾던 밀레니즈 루프는 '스페이스 블랙'이 맞으니 잘 된 일이지만 거래할 때는 조금 조심할 필요가 있겠다. 포장은 여타 다른 밴드들과 다를 바 없으니 바로..
198. Concurrency with Context Concurrency with Context 대부분의 경우 하나의 Context로도 부족함이 없지만, 처리량이 많아지는 경우 Background Context를 활용한 동시처리(Concurrency)가 요구될 수 있다. MainQueueConcurrencyType과 PrivateQueueConcurrencyType으로 구분되며, 각각 Main Thread와 Background Thread에서 작동한다. Concurrency Context를 구현할때의 주의점은 다음과 같다. Context는 Thread에 안전하지 않다. Context에서 일어나는 모든 작업은 Context를 생성한 Thread에서 진행하고, 완료해야 한다. 다른 Context로 ManagedObject를 전달할 수 없다. 구조적으로 불가능..
Stack #1 Stack 구조 Stack은 기본적으로 위와 같이 출구와 입구가 하나인 구덩이의 모습을 한다. 폰 스택(phone stack) 놀이와 같이 바닥에 깔려 있는 내 전화에서 벨이 울린다고 위에 있는 다른 전화를 건들지 않고 내 것만 쏙 빼서 확인할 수 없다. Stack도 마찬가지이다. 가령 index 4에 접근하기 위해서는 7, 6, 5를 순서대로 접근한 후에야 4에 접근할 수 있다. 이러한 특징 때문에 Stack을 LIFO(Last In First Out/후입 선출) 구조라고 정의하기도 한다. Pointer Stack에 현재 저장돼 있는 데이터의 수를 나타낸다. 고정길이 스택의 경우 Pointer
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에 반영함으로써..
애플 스포츠 루프 (토네이도 그레이 그린 + 실버) 서론 기본 스포츠 밴드도 훌륭한 밴드지만 본격적인 운동용으로 사용하기엔 땀으로 인한 갑갑함이 조금 불편한 경우가 많다. 버튼식으로 체결하도록 돼 있으면서도 먼저 고리에 걸리고 착용하는 것이 아닌 버튼을 먼저 잠그고 남은 부분을 고리에 넣어 손목 안 쪽에서 정리하도록 돼 있기 때문에, 보기에 깔끔하다는 장점이 있음과 동시에 착용 시 낙하의 위험성 또한 존재한다. 버튼을 잠그는 방식도 구멍을 통해 이루어 지기 때문에 사용자의 손목에 '완벽히' 맞출 수는 없다. 이를테면 세 칸은 너무 크고 두 칸은 너무 조이는 애매한 상황이 오묘한 불편함을 만드는 경우가 있다. 그래서 애플워치를 구입하고 시작한 줄질의 시작은 '스포츠 루프'가 되겠다. 본론 애플워치 밴드를 비롯한 애플의 '액세서리'들은 일정한 주기로 제품을 ..