일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- RaceCondition
- Realm
- 청년취업사관학교
- SRP
- cleanarchitecture
- 오픈채팅방
- DiffableDataSource
- MainScheduler
- MainScheduler.Instance
- combine
- MainScheduler.asyncInstance
- DynamicMemberLookup
- GCD
- 프로그래머스
- MethodSwilzzling
- 코테
- rxswift
- gitflow
- DependencyInjection
- SwiftUI
- data_structure
- leetcode
- swift
- CoreBluetooth
- 등굣길
- 명품cppProgramming c++
- GIT
- DispatchQueue
- IOS
- SeSAC
- Today
- Total
목록분류 전체보기 (73)
Do.
xcresult 파일 생성 우선 junit.xml 포멧으로 변환하기 전에 xcresult 파일을 생성할 필요가 있습니다. 우선 xcresult는 xcode에서 바로 생성되기도 하는데요. (xcode 14.3 기준) 심플하게 찾는 법은 Report Navigator 테스트 결과에서 Ctrl + click 하면 바로 Show in Finder를 볼 수 있습니다. CLI 하지만 보통은 테스트 자동화는 CI/CD를 통해서 이루어 지기 때문에 CLI를 통해 test를 돌릴 필요가 있습니다. xcodebuild -scheme PleaseAttendancePresentationLayer test -destination "platform=iOS Simulator,name=iPhone 14 Pro,OS=16.4" -re..
소개두 개념 모두 생호 배제를 목적으로 한다는 것은 동일하나 이전글의 출력문을 봐서 알겠지만 다른 양상을 보입니다. 어떤 차이에 의해서 그러한 현상이 발생할까요? 이번에는 단골 질문 중 하나인 Semaphore와 Mutex의 차이에 대해서 알아보려고 합니다.Semaphores우선 Semaphore는 P(wait)와 V(signal)로 이루어 져 있습니다. wait 연산은 Semaphore의 값을 감소시키고, signal은 값을 증가 시킵니다. Semaphore의 값이 0일 때, wait 연산을 수행하는 모든 프로세스는 다른 프로세스가 signal 연산을 수행할 때까지 차단되게 됩니다. 이전글에서 설명했었죠? 즉 Semaphore는 사실 정수와 같습니다. 단순히 숫자를 증가시키냐 감소시키냐 와 같다는 것이..
Race Condition레이스 컨디션이란 동시에 여러 스레드 또는 프로세스에서 공유 자원에 접근하고 수정하는 상황에서 발생하는 문제를 말합니다. 특별히 신경쓰지 않으면 멀티스레드 환경에서 반드시 발생할 수 있는 것이죠. 흔히 발생하는 현상으로는 결과값이 예상과는 다르게 나오거나 잘못된 순서로 데이터가 적재됩니다. 메모리를 다루는 경우에는 BAC_ACCESS와 함께 앱 크래시가 발생할 수 있는 위험한 경우입니다! 어떤 상황에서 레이스 컨디션이 발생하는지 알아보겠습니다.Examplelet concurrentQueue = DispatchQueue(label: "com.queue", attributes: .concurrent) var sharedResource = 0 func test_task() throws..
What’s new in swift “pack” 기존에는 타입추론을 통해서 이러한 동작이 가능했습니다. struct Request { ... } struct RequestEvaluator { func evaluate(_ request: Request) -> Result } func evaluate(_ request: Request) -> Bool { return RequestEvaluator().evaluate(request) } Result가 Boolean 이라서 Boolean으로 값이 출력됩니다. 만약 여러 Boolean 결과를 얻고 싶다면 let value = RequestEvaluator().evaluate(request) let (x, y) = RequestEvaluator().evaluate(..
개요 RxSwift를 사용하게 되면 View Layer에서 사용하게 될 때는 꼭 메인 스레드로 변경하도록 코드를 지정해줘야 합니다. 이때 일반적으로 저희가 사용하는 코드는 MainScheduler.instance 와 MainScheduler.asyncInstance 가 있는데, 이 둘은 근본적으로 무슨 차이가 있을까요? 우선 RxSwift 문서에 의하면 다음과 같이 설명하고 있습니다. 요약하자면 메인 큐에 작업 스케줄이 이미 된 코드라면 별도의 스케줄링 없이 바로 동작한다고 적혀있습니다. 무슨 뜻인지 좀더 확실하게 알아볼까요? override func scheduleInternal(_ state: StateType, action: @escaping (StateType) -> Disposable) -> D..
소개개발자로 취업한지 벌써 1년이 훌쩍 지났습니다. 아직까지도 그리고 앞으로도 세상에서 가장 잘한 선택인 것은 개발자로 이직을 했다는 것입니다. 여전히 일하는게 즐겁고 또 내일이 기대되는 나날이네요. 요즘은 비전공자들을 교육 시켜서 개발자로 취업시켜주는 좋은 교육과정이 정말 많은데 저는 딱 한군데 후회하지 않을 곳을 소개시켜드리고 싶습니다. 바로 청년취업사관학교(SeSAC)의 (영등포 SW과정) iOS 앱 개발자 데뷔 과정 PLUS 입니다! 다른 좋은 교육과정보다 더 좋은곳이라고 소개하는 데에는 합당한 이유가 있어야 겠죠? 물론 제가 해당 교육과정을 통해서 취업을 할 수 있었다는 부분이 가장 크지만 그럴 수 있었던 배경에는 무엇이 있을까 생각해보면iOS 앱 개발자 데뷔 과정 PLUS의 특장점!진심으로 수..
개요 RxSwift나 Combine 등에서 subscribe에서 escaping closure를 다룰 시 필연적으로 캡처 리스트를 통해 약한 참조를 해야할 때가 있습니다. 아주 지긋지긋 하죠? Xcode 14.3(swift 5.8) 이후 부터는 weak self를 바인딩 한번 한 이후 부터는 self를 붙일 필요가 없긴 합니다만.. 바인딩 코드를 작성하는 것도 매우 귀찮은 일.. 이를 RxSwift(6.0)에서는 withUnretained라는 설탕 문법이 있습니다. observerble .withUnretained(self) .subscribe { (owner, output) in owner.value = output } .dispose() 요 편리한 코드를 그대로 Combine에서 써볼려고 합니다. 구..
Intro 서비스를 개발하면 반드시 네트워크에 대한 요청 및 응답 로직을 작성해야 하는데 개발하는 과정에서 로직이 간단한 경우는 최소 한두번, 복잡한 경우는 수십번은 테스트 과정에 네트워크 동작이 발생할 수 있습니다. 뿐만 아니라 몇몇 상황을 고려할 때 실제 서비스(Dev 서버라 하더라도) 를 호출하는 것은 문제점이 많습니다. 따라서 네트워크 모듈 단위 테스트를 실시할 때 어떤 방법이 있을지 알아보려고 합니다. 실제 네트워크 요청시 문제점 우선 네트워크 단위 테스트를 할 때 실제 네트워크를 요청하게 되면 어떤 문제가 있을까요? 물론 간단한 서비스의 경우는 실제 네트워크 요청이 일어나더라도 크게 문제 없을 수도 있습니다. 하지만 여러분이 하는 대부분의 서비스는 복잡하고, 무겁고 어려울 수 있습니다. 그러면..