RayWenderlich
-
Ch7. Unit TestingRay Wenderlich/CoreData 2022. 10. 31. 00:41
Core Data stack for testing 좋은 유닛테스트는 FIRST를 따른다. Fast Isolated Repeatable Self-verifying Timely 이 샘플 프로젝트의 테스트 타겟은 서비스를 위한 앱 타겟과 다른 AppDelegate를 사용하도록 셋팅되어 있다. 코어 데이터는 디스크에 데이터를 Write한다. 하지만 이는 Isolated하지 않다. 또한 데이터가 영구적이기에 한 번 데이터를 Write하면 다른 테스트에 영향을 줄 수 있다. Repeatable하지 않다. 그렇다면 데이터를 Write하고 Delete해주면 어떨까? 이는 Fast하지 않다. 이를 해결하기 위해 in-memory SQLite store를 사용한다. class TestCoreDataStack: CoreDa..
-
Ch6. Versioning & MigrationRay Wenderlich/CoreData 2022. 10. 27. 22:41
마이그레이션이 필요한 아래 시나리오를 구현해본다. [노트를 작성할 수 있는 앱] 텍스트를 작성할 수 있다. 이미지를 추가할 수 있도록 변경. (Lightweight migration) 이미지를 여러장 추가할 수 있도록 변경. (Manual migration using Mapping model) 이미지가 아닌 다른 리소스도 첨부할 수 있도록 변경. (Manual migration using Mapping model and subclass of NSEntityMigrationPolicy) 연속적이지 않은 버전의 마이그레이션을 지원하기 Ex) v2 → v4 The migration process 마이그레이션은 3단계로 나뉜다. First, Core Data copies over all the objects f..
-
Ch5. NSFetchedResultsControllerRay Wenderlich/CoreData 2022. 10. 27. 22:34
NSFetchedResultsController의 세 가지 장점 Section Cache Monitoring 이전 챕터에서 봤듯, CoreData는 UITableView와 잘 어울린다. NSFetchedResultsController를 사용하면 UITableView와의 조합을 더 잘 활용할 수 있다. NSFetchedResultsController는 NSFetchRequest를 감싸며 FetchResult를 내부에 갖고 있다. 그래서 fetch하는 메소드의 리턴타입이 Void다. lazy var fetchedResultsController: NSFetchedResultsController = { let fetchRequest: NSFetchRequest = Team.fetchRequest() let zo..
-
Ch2. NSManagedObject SubclassesRay Wenderlich/CoreData 2022. 10. 27. 22:33
Modeling your data XCode Editor에서 attribute를 원하는대로 추가할 수 있다. 원하는 이름과 타입을 선언하면 된다. 타입은 매우 종류가 많다. Boolean, Date, Double, String, Integer16, Integer32, Integer64, UUID, URI 등 그리고 Binary Data도 있다. (blob형태로 저장하는 기능이 지원됨) 그런데 바이너리를 저장했다가는 이 엔티티에 접근할 때마다 바이너리 데이터가 메모리에 올라가기 때문에 비효율적이다. XCode는 이를 방지하고자 Attributes Inspector에서 Allows External Storage옵션을 제공한다. Allows External Storage → 데이터베이스에 바로 파일을 저장하지..
-
Ch14. AnimationsRay Wenderlich/SwiftUI 2021. 2. 14. 18:23
SwiftUI의 애니메이션은 UIKit보다 훨씬 간단하다. Animating state changes 직역해보면 물음표 짓게 만들지만 코드를 보면 이해가 된다. Adding animation Image(systemName: "chevron.up.square") .rotationEffect(.degrees(showDetails ? 0 : 180)) .animation(.default) 1, 2번 라인은 showDetails값에 따라 rotation을 업데이트한다. 즉 3번 라인이 없어도 무방하다. .animation(.default) 한 줄로 이미지가 회전하는 애니메이션이 생겼다. 0과 180을 오가는 애니메이션은 정방향 기준으로 시계방향으로 회전할 것이다. 하지만 180대신 -180을 넣으면 반시계방향으..
-
Ch13. Drawing & Custom GraphicsRay Wenderlich/SwiftUI 2021. 2. 14. 18:18
Creating shapes SwiftUI은 드로잉 Structure를 제공하는데 그 중 가장 간단한 것이 Rectangle이다. Rectangle() 이렇게 하면 검은색으로 화면이 뒤덮일것 .frame(width: 200, height: 200) 이렇게 추가해주면 화면 가운데에 200x200의 검은 사각형이 생긴다. .environment(\.colorScheme, .dark) 컬러 스킴에 따라 다른 색의 사각형이 생기는 것도 확인 가능 .fill(Color.blue) 명시적으로 컬러 선택도 가능 Using gradients .fill( LinearGradient(gradient: .init(colors: [Color.green, Color.blue]), startPoint: .bottomLeading..
-
Ch12. Conditional ViewsRay Wenderlich/SwiftUI 2021. 2. 14. 18:15
Displaying a modal sheet SwiftUI가 @State 프로퍼티를 사용하여 Modal을 띄우는 방식엔 2가지가 있음 Bool을 사용하여 true일 때 띄우기 Optional을 사용하여 not nil일 때 띄우기 @State private var isPresented = false Button(action: { self.isPresented.toggle() }) { HStack { someViews() } .sheet(isPresented: $isPresented, onDismiss: { print("Modal dismissed. State now: \(self.isPresented)") }) { viewToPresent() } } Programmatically dismissing a m..
-
Ch6. Intro to controls: Text & ImageRay Wenderlich/SwiftUI 2021. 2. 7. 20:08
Ch6. Intro to controls: Text & Image Are modifiers efficient? Modifier는 새로운 view를 리턴한다. 정말 이게 최선일까? Modifier는 사용될 때마다 뷰를 전달받아 새로운 뷰를 만든다. Recursive한 동작이 일어나는 것이다. Modifier를 연속적으로 호출하면 뷰 안에 뷰 안에 뷰 안에 뷰가 있는 그런 구조다. 마트료시카 인형처럼 말이다 언뜻보면 자원낭비처럼 보인다. 하지만 SwiftUI는 이 Stack을 효율적인 자료구조를 통해 flatten하여 뷰를 렌더링하고 있다. 그러니까 modifier를 마음껏 써도 된다. Text("Welcome to Kuchi") .background(Color.red) .padding() Text("Wel..