분류 전체보기 (351) 썸네일형 리스트형 애플 밀레니즈 루프 (진품 구별법 / 스페이스 블랙 + 실버) 서론 운동용으로 산 워치에 줄질이 웬 말이냐며 하지 않겠노라고 다짐한 나는 어딜 가고, 슬슬 올라가는 기온, 늘어가는 땀과 함께 밀레니즈 루프에 대한 관심이 늘어만 갔다. 어쩌다 보니 밀레니즈 루프 거래만 두 번을 진행했고, 한 번은 가품이었던 희한한 경험을 했는데, 이렇게 된 김에 둘이 어떤 차이가 있는지 비교라도 해 보려고 한다. 본론 물론 두 번의 거래가 모두 정상이라고는 말하지 않았다. 첫 번째 거래는 '스페이스 블랙 밀레니즈 루프'가 가품이었고, 두 번째 거래는 '그라파이트 밀레니즈 루프'가 '스페이스 블랙 밀레니즈 루프'였다. 결론적으로 내가 찾던 밀레니즈 루프는 '스페이스 블랙'이 맞으니 잘 된 일이지만 거래할 때는 조금 조심할 필요가 있겠다. 포장은 여타 다른 밴드들과 다를 바 없으니 바로.. 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에 반영함으로써.. 애플 스포츠 루프 (토네이도 그레이 그린 + 실버) 서론 기본 스포츠 밴드도 훌륭한 밴드지만 본격적인 운동용으로 사용하기엔 땀으로 인한 갑갑함이 조금 불편한 경우가 많다. 버튼식으로 체결하도록 돼 있으면서도 먼저 고리에 걸리고 착용하는 것이 아닌 버튼을 먼저 잠그고 남은 부분을 고리에 넣어 손목 안 쪽에서 정리하도록 돼 있기 때문에, 보기에 깔끔하다는 장점이 있음과 동시에 착용 시 낙하의 위험성 또한 존재한다. 버튼을 잠그는 방식도 구멍을 통해 이루어 지기 때문에 사용자의 손목에 '완벽히' 맞출 수는 없다. 이를테면 세 칸은 너무 크고 두 칸은 너무 조이는 애매한 상황이 오묘한 불편함을 만드는 경우가 있다. 그래서 애플워치를 구입하고 시작한 줄질의 시작은 '스포츠 루프'가 되겠다. 본론 애플워치 밴드를 비롯한 애플의 '액세서리'들은 일정한 주기로 제품을 .. 없는 날짜는 어떻게 표시해야 할까? 서론 우리 가족은 생일에 대해 그리 민감하지 않다. 선물을 챙겨 주거나 파티를 하지도 않고, 그냥 잊고 지나가거나 어쩌다 운이 좋아 그날 알아차린다면 축하한다며 인사 한 마디 하는 게 전부다. 선물을 챙긴다고 해도 받는 사람이 뭘 원하는지, 받아도 실망하지 않을 선물은 무엇인지, 어떻게 하면 기억에 오래 남을지 생일을 챙겨 본 사람이라면 누구나 공감할 골칫거리인데 이게 매년 있다고 생각하면 아주 불편해진다. 문제는 사회생활이란 게 그리 녹록지 않다는 거다. 우리 가족이 아닌 누군가에게는 특별한 날일 수도 있고, 누군가는 나에게 축하받는 것이, 혹은 나를 축하해 주는 것이 특별한 일일 수도 있다. 세상에는 매 년 존재하지 않는 날이 있다. 양력으로는 2월 29일, 음력으로는 2월 30일이다. 실제 생일로 .. 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.. 애플워치 시리즈 6 서론 영원한 것은 없다고 했던가, 영영 끝날 것 같지 않았던 코로나도 슬슬 힘이 다하는 것 같다. 운동을 잘 하진 못하지만 좋아하는 하는 사람으로서, 졸업 전 까지는 새벽에 산책을 나가거나 점심이 소화가 되지 않는 날이면 저녁을 거르고 후배와 함께 운동을 나가곤 했다. 덤벨이나 풀업 등의 맨몸 운동은 그렇다 치고, 파트너가 사라지면서 뚝 끊게 된 유산소 운동은 묘한 미련과 함께 항상 마음 한 구석에 자리 잡고 있는 것이었다. 왼쪽 손목에는 대학교 입학때 샀던 시계가 항상 자리하고 있었다. 엄청 대단한 시계는 아니었지만 처음 가지게 된 나만의 시계다. 가는 팔목에 어울리는 꽤나 작은 알을 가지고 있었고, 이후 살이 더 빠지게 된 후 통줄로 감당이 되지 않아 직접 나토 밴드로 교체해 사용하기도 했다. 첫 시.. 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.. 이전 1 ··· 16 17 18 19 20 21 22 ··· 36 다음