일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- MethodSwilzzling
- CoreBluetooth
- cleanarchitecture
- DispatchQueue
- MainScheduler.asyncInstance
- GCD
- SwiftUI
- GIT
- 프로그래머스
- leetcode
- 코테
- 청년취업사관학교
- rxswift
- SeSAC
- gitflow
- combine
- Realm
- 명품cppProgramming c++
- MainScheduler
- DynamicMemberLookup
- 등굣길
- 오픈채팅방
- data_structure
- DependencyInjection
- MainScheduler.Instance
- swift
- SRP
- RaceCondition
- IOS
- DiffableDataSource
- 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 서버라 하더라도) 를 호출하는 것은 문제점이 많습니다. 따라서 네트워크 모듈 단위 테스트를 실시할 때 어떤 방법이 있을지 알아보려고 합니다. 실제 네트워크 요청시 문제점 우선 네트워크 단위 테스트를 할 때 실제 네트워크를 요청하게 되면 어떤 문제가 있을까요? 물론 간단한 서비스의 경우는 실제 네트워크 요청이 일어나더라도 크게 문제 없을 수도 있습니다. 하지만 여러분이 하는 대부분의 서비스는 복잡하고, 무겁고 어려울 수 있습니다. 그러면..