[ 이 글에서 다루는 내용 ] - actor 의 등장배경 - actor - nonisolated - global actor - main actor [1] actor 가 나오기 전에는? 예전에는 data race가 발생할 수 있다면 lock 이나 queue 를 추가 구현해줘야했다. 대충 data race 가 발생할 수 있는 상황을 만들고, Thread Sanitizer 를 켜고 돌려보자. class UserManager { static let shared = UserManager() private(set) var userName = "" private init() {} func updateUserName(to name: String) { print(Thread.current) userName = name ..
Sendable 문서와 WWDC 22 > Eliminate data races using Swift Concurrency 를 조합해서 재구성한 내용입니다. [1] Sendable = safe to share in concurrency Sendable 프로토콜은 concurrency 환경에서 안전하게 공유될 수 있는 타입을 나타냅니다. 즉 우리는 하나의 concurrency domain (또는 isolation domain)에서 다른 domain으로sendable type을 안전하게 pass 할 수 있습니다. (data race를 만들지 않고) [2] Sendable 을 채택할 수 있는 타입 1. Value Types frozen struct or enumeration. 아래 사진에 나오..
[1] TaskGroup과 ThrowingTaskGroup ✓ TaskGroup : A group that contains dynamically created child tasks. (자세한 설명은 이 글 5번 참고) taskGroup을 만드려면 withTaskGroup(of:returning:body:) 를 호출. ✓ ThrowingTaskGroup: A group that contains throwing, dynamically created child tasks. throwing task group을 만드려면withThrowingTaskGroup(of:returning:body:) 를 호출 [2] 사용예제 2.1 간단한 병렬 실행을 위해 async-let syntax 를 쓰다가 확장이 필요할 ..
[ 니즈 ] 이렇게 된 구성에서 1. SharedUI 안에 커스텀 폰트를 넣고 프리뷰로 커스텀 폰트를 보고 싶음. 2. SharedUI 를 의존하는 Feature1 타겟의 프리뷰로 커스텀 폰트를 보고 싶음. 3. 앱의 UIKit 기반 코드에서도 SharedUI의 커스텀 폰트를 쓰고 싶음. [ 작업 ] ~~ 귀여운 마루부리 폰트와 함께하는 예제 ~~ # 1. 폰트파일을 넣을 폴더를 원하는 경로에 만들고 Pacakge > resources 추가하기 // swift-tools-version: 5.5 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescript..
[1] task modifier - task(priority:_:) // Adds an asynchronous task to perform before this view appears. - task(id:priority:_:) // Adds a task to perform before this view appears or when a specified value changes. [2] 필요성 task modifier 가 나오기 전에는 뷰가 disappear 될 때 진행 중인 task 를 cancel 해주기 위해 어딘가에 (아래 예제는 뷰인데 보통 뷰모델) task 를 들고 있고 onDisappear 에서 cancel을 해줘야했음. struct SampleView: View { var body: some ..
WWDC 2016 > Understanding Swift Performance 를 보다가 명확히 몰랐던 세가지를 알게 되었다. 1️⃣ final 키워드를 붙이면 컴파일이 빨라진다고 알고 있는데 이유가 뭘까? 2️⃣ uuid 필드를 String 타입 vs UUID 타입으로 들고 있는 것 중에 뭐가 더 좋은걸까? 3️⃣ 프로토콜과 달리 제네릭을 쓸 때는 구체타입을 왜 못바꿀까? [1] final 키워드 --- WWDC 세션 중 Method Dispatch 부분에 나오는 내용 ---- ✓ static dispatch: 컴파일 타임에 어떤 구현이 실행될 건지 알 수 있음 ✓ dynamic dispatch: 런타임에 어떤 구현이 실행될 건지 알 수 있음 static dispatch 인 경우, 컴..
단위 테스트 4-7장 (Part 2. 개발자에게 도움이 되는 테스트 만들기) 내용 정리 4장 좋은 단위 테스트의 4대 요소 # 좋은 단위 테스트의 네 가지 특성 - 회귀 방지 - 리팩터링 내성 - 빠른 피드백 - 유지 보수성 1) 첫번째 요소: 회귀 방지 회귀 방지는 테스트가 얼마나 버그(회귀)의 존재를 잘 나타내는 지에 대한 척도다. 회귀 방지 지표에 대한 테스트 점수가 얼마나 잘 나오는 지 평가하려면 테스트 중에 실행되는 코드의 양 / 코드 복잡도 / 코드의 도메인 유의성 을 고려해라. 단순한 코드를 다루는 테스트는 회귀 오류가 많이 생기지 않는다. 기반 코드에 실수할 여지가 많지 않다면 테스트는 회귀를 나타내지 않을 것이기 때문 이다. 복잡한 비즈니스로직을 다루는 테스트가 더 좋다. 2) 두번째 요..
Processing URL Session Data Task Results with Combine 에 나오는 내용입니다. [ 목표 ] Combine으로 네트워크 쪽 코드를 작성하는 것은 크게 두가지 절차를 거칩니다. 1. Data Task Publisher 를 만든다. 2. 비동기 연산자 (asynchronous operator) 들을 체이닝하여 data를 받고 처리한다. 이를 알아봅니다. 또한 네트워크 쪽 코드작성할 때 필요한 에러 핸들링, 스케쥴링, share 도 알아봅니다! [1] Data Task Publisher 만들기 URLSession 은 Combine Publisher 인 URLSession.DataTaskPublisher 를 제공합니다. func dataTaskPublisher(for: U..
단위 테스트 1~3장 (Part 1. 더 큰그림) 내용을 기반으로 하고 있습니다. 1장 단위테스트의 목표 # 단위테스트 현황 논쟁은 '단위 테스트를 작성해야하는가?' 에서 '좋은 단위 테스트를 작성하는 것은 어떤 의미인가?' 로 바뀌었다. # 단위테스트의 목표 - 소프트웨어 프로젝트의 지속 가능한 성장을 가능하게 하는 것 지속가능한 프로젝트 성장을 위해서는 고품질 테스트에만 집중해야한다. (사람들은 종종 테스트가 많으면 많을 수록 좋다고 생각한다. 하지만 그렇지 않다. 코드는 자산이 아니라 책임이다. 코드가 많아질 수록, 소프트웨어 내의 잠재적인 버그에 노출되는 표면적이 더 넓어지고 프로젝트 유지비가 증가한다.) 테스트는 코드의 단위가 아니라 동작의 단위. 즉 문제 영역에 의미가 있는 것. 이상적으로는 ..
단위 테스트 3장 내용을 기반으로 하고 있습니다. [ 저자가 생각하는 단위테스트 네이밍 안티패턴 ] 1. 엄격한 명명구조 가장 유명하지만 가장 도움이 되지 않는 방법 중 하나가 다음과 같은 관습이다. [테스트 대상 메서드]_[시나리오]_[예상결과] - 테스트 대상 메서드: 테스트 중인 메서드의 이름 - 시나리오: 메서드를 테스트하는 조건 - 예상결과: 현재 시나리오에서 테스트 대상 메서드에 기대하는 것 동작 대신 구현 세부사항에 집중하게끔 부추기기 때문에 분명히 도움이 되지 않는다. 간단하고 쉬운 영어 구문이 훨씬 더 효과적이다. 예를들어 public class CalculatorTests { public void Sum_of_two_numbers() { ... // when double result =..
- Total
- Today
- Yesterday
- ipad multitasking
- Dart Factory
- 장고 Custom Management Command
- 구글 Geocoding API
- flutter deep link
- SerializerMethodField
- Django Heroku Scheduler
- 플러터 싱글톤
- DRF APIException
- Flutter Text Gradient
- Flutter Clipboard
- flutter build mode
- Django Firebase Cloud Messaging
- 장고 URL querystring
- METAL
- PencilKit
- 플러터 얼럿
- Sketch 누끼
- Python Type Hint
- flutter 앱 출시
- drf custom error
- flutter dynamic link
- Flutter getter setter
- cocoapod
- Watch App for iOS App vs Watch App
- Flutter Spacer
- github actions
- Flutter 로딩
- ribs
- Django FCM
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |