What is SilentPush?- 백그라운드에서 앱 업뎃하기 즉 유저가 느끼지 못하게 앱 내에서 정보를 업뎃해야할 때 사용한다. 내가 개발하는 앱에서는 해당 날짜의 여행이 있을때 silentPush로 상태 변화를 위해 사용했다. 기존의 코드에서는 매일 24시간마다 백그라운드에서 allFetch를 통해 여행이 있는지를 체크해주었지만 이는 여행이 없더라도 매일 백그라운드에서 업뎃을 하기에 비효율적이라고 판단했다.Silent Push 페이로드에서는 3가지가 값이 추가로 있어야 가능하다고 한다. "content-available": 1, "apn-push-type": "background","apn-priority": 5apple developer에 보면 이 푸쉬는 우선순위가 낮아 짧은 시간에 노티피케이션 ..
TCA의 테스트코드 적용을 살펴보기 전에 먼저 TestCode에 대해 생각해보고 가려한다. 어디까지 짜야하고 어디까지 커버리지를 올려야하는가..에 관한 얘기가 될수 있을거같다.먼저 Unit Test와 UITest가 있다. Unit Test는 내가 원하는 메서드들이 의도한대로 작동을 하는지를 검증하는것이다.효과적인 UnitTest를 위해 가장 먼저 생각해봐야할 First 한 FIRST가 있다.Fast: 테스트가 빠르게 실행되어야한다. 왜? 느린 테스트는 개발자가 또 코드를 수정하고 결과를 확인하기까지 시간이 걸리므로 생산성 저하Independent/Isolated: 테스트는 서로의 상태를 공유해서는 안된다. 즉 의존하지 않고 각각의 테스트 서로 독립적으로 실행되어야 신속하게 변경에 반응할 수 있다.Repe..
위치나 비컨을 통해 조건에 모니터링 하는 API이다.사실상 너무 간단하다. 사용법은 위와같이 원하는 이름의 CLMointor를 만들어주고 조건을 걸어준 후 이벤트를 기다린 후 이벤트에 달성하면 원하는 동작을 해주면 된다. Easy하지만 어떻게 구현되어있는지를 살펴보자 swift의 최상위 액터이다. CLMonitor 인스턴스는 각각 하나의 모니터링 작업에 대한 "게이트웨이" 역할을 한다. CLMonitor는 액터로서 설계되었기 때문에, 여러 스레드가 동시에 같은 인스턴스에 접근하려 할 때도 액터 자체가 이들을 직렬화하여 안전하게 처리할 수 있다. 이로 인해 추가적인 동기화 메커니즘이나 스레드 관리에 신경 쓸 필요가 없어지며, 동시성에 대한 걱정 없이 비동기적으로 작업을 수행할 수 있다.그래서 위에서 본 것..
https://www.youtube.com/watch?v=nb3bRQa0iGQ&t=3s 1. 성능이 뭔데?- 지연, 에너지 소모, 메모리 관련들이 섞여 영향을 주는 것. 2. 낮은 수준의 성능을 볼 때 고려해야할 원칙들 bottom-up으로 생각을 해보자- 최적화되지 않은 함수 호출들: 4가지의 cost가 있다고 한다. 이 중 3가지는 우리가 하는것. 1. 먼저 호출에 의한 인수를 설정(arguments)가장 낮은 수준인 1번은 우리가 함수를 호출할때 인수를 넣어야한다. 최신 프로세서에선 이러한 비용이 레지스터 이름변경으로 숨겨진다. 그래서 뭐 고려할껀 없다. 2. 호출하는 함수의 주소 확인 좀 더 높은 레벨에선, 함수의 컨벤션에 맞게 컴파일러가 값의 복사본을 추가해야할 수 있다. 3. 함수의 ..
이 글은 https://www.youtube.com/watch?v=X_JYRz-Hd0o유튜브의 wwdc24영상을 다 챙겨보면서 이건 정리할 필요가 잇따고 생각을 하여 정리를하고 있슴다.앱이 시작하면 가상메모리의 빈 주소 공간을 얻는다. -> 앱이 시작 되면 시스템이 Main Executable, 연결된 라이브러리들을 로드하고 디스크의 읽기전용 리소스 영역에 매핑한다. -> 앱이 실행되면 각 스레드의 로컬 및 임시 변수저장에 대한 스택영역도 사용이 가능해진다. 동적 메모리는 힙이라는 공간에 저장된다.힙힙은 하나의 메모리블록이 아니라 multiple 가상 메모리 영역으로 구성된다. 각 영역들은 개별 할당으로 구분된다. 내부적으로 16KB메모리 페이지로 구성되어있다. 총 3가지 상태가 있는데, 아직 기록되..
잉? 나는 따로 구조체에서 Init을 선언해주지 않았는데 뜨네?이게모지? memberwise initialization 이는 컴파일러가 자동으로 init메서드를 생성해주기 때문이다. 그렇다면 만약 WhatisMacro에 어떤 프로퍼티도 추가해주고 야 이것도 자동 컴파일러가 하게 해줘! 🍎음...비효율적인데? 물론 swift compiler는 오픈소스야 잠만. 우리회의해보자... 🧑🏼💻어? 그럼 일일이 너네랑 회의해야해? 확장서 개그지같네;; 그래서 나온놈이 매크로다! 🧑🏼💻얘가 원하는데로 컴파일러를 수정하지 않고 Swift Package로 배포하는 방법! 매크로 어떻게 선언하는데? public macro OptionSet() = #externalMacro(module: "SwiftMacros", ty..
https://bbiguduk.gitbook.io/swift/language-guide-1/initialization 초기화 (Initialization) | Swift 타입의 저장된 프로퍼티에 초기값을 설정하고 초기 설정을 수행합니다. 초기화 (Initialization) 는 인스턴스의 클래스, 구조체, 또는 열거형을 사용하기 위해 준비하는 단계입니다. 이 단계에는 인 bbiguduk.gitbook.io 여기들어가면 어마어마하ㄷ..분량이... 그만큼 초기화가 swift에서 중요하다. Swift는 모든 저장된 프로퍼티가 초기값을 받을 수 있도록 클래스 타입에 대해 2가지의 초기화 구문을 정의한다. => 바로 지정된 초기화와 편의 초기화라는 친구들이다. 지정된 초기화(designated Initialize..
Swift의 함수는 1급 타입(First Class-type)이다 근데 1급타입이 몬데 ? 아래의 3가지를 만족하면된다.아래의 3개가 1급시민의 조건이고 그것을 충족하는 객체가 1급객체이다. 변수와 상수에 함수가 저장될수 있다. 아래에서 보면 increment라는 변수에 함수를 할당해주었다. 그러면 저 변수는 함수 그자체 그런데 주의 할게 동일한 이름의 함수가 오버로딩 되어있을때는 타입추론이 안되고 타입 명시를 해주어야함. 함수가 다른 함수를 값으로 반환할 수 있다. func makeIncrementer() -> ((Int) -> Int) { var answer = 1 func addOne(number: Int) -> Int { return answer + number } return addOne } v..
Swift기본을 다지기 위해 공부하던중 역설과 전제조건....뭐야 왜이렇게 입에 안달라붙고 한국어가 어렵냐..하며 찾아봤다... - Runtime시 발생하는 조건 - 불값이 true면 코드가 진행되고 false면..? 종료시킬수 있음 - 역설은 개발과정에서의 실수를 찾는데 도움을 주고 전제조건은 프로덕션문제 감지하는데 도움을 준다. => 유효하지 않은 조건이 발생하지 않도록 코드를 디자인하기 위해 사용한다. 뭐가다른데? 역설은 오직 디버그 빌드에서만 체크(프로덕션에서는 영향을 안주기에 개발단계에서 많이 해도 상관없다) 전제조건은 디버그와 프로덕션 빌드에서 체크 출시할때 엄청 크리티컬한거 예를들면 어? 이 함수 저번 버전인데 우리 업데이트했는데? 그래서 안바꾸면 API통신 안될텐데.? 프로덕션하고 디버그 ..
우선 Swift를 다시 공부하기 전에 나도 1년동안 했는데 머리가 좀 커졌잖아?? 그러니 하나하나 할때 Deep Dive를 해보자!! Swift는 우선 스크립트 언어가 아닌! 함수형언어이자 컴파일 언어이다. 먼저 스크립트 언어란? 컴파일러 없이 한줄 한줄 읽으며 실행한다.번역속도는 빠르지만 매번 실행시킬때마다 한줄한줄...읽어야해서 프로그램 실행속도는 컴파일언어보다 느리다. 컴파일 과정이 없어서 실행해봐야 오류가 있는지없는지 안다. 컴파일언어란?소스코드를 컴파일러가 컴파일 하여 objc파일로 만들고 링커가 실행파일로 만드는 과정이 필요한 언어. Swift Compile과정!!! 1. 먼저 컴파일전에 전처리를 한다 (#define, #include)요론놈들 2. 파싱을 함. 전처리된 소스코드를 토큰단위로 ..