일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- CoreBluetooth
- combine
- swift
- SRP
- baseviewcontroller
- 청년취업사관학교
- MainScheduler.Instance
- 오픈채팅방
- 명품cppProgramming c++
- 프로그래머스
- DependencyInjection
- leetcode
- 코테
- 등굣길
- DispatchQueue
- rxswift
- DynamicMemberLookup
- SwiftUI
- MainScheduler.asyncInstance
- gitflow
- SeSAC
- cleanarchitecture
- IOS
- MainScheduler
- data_structure
- RaceCondition
- DiffableDataSource
- Realm
- GCD
- MethodSwilzzling
- Today
- Total
목록전체 글 (74)
Do.
데코라이크(Decorator Like)로 더 유연한 ViewController 구조 만들기IntroiOS 앱을 개발하다 보면, 공통된 로직(예: 화면 전환 시 네비게이션 바/탭 바 보이기·숨기기, deinit 시점 로그 남기기 등)을 여러 개의 뷰컨트롤러에 반복해서 적용해야 하는 상황이 생깁니다. 이때 종종 가장 먼저 고려되는 방법이 바로 BaseViewController를 만드는 것이죠. BaseViewController에 공통 코드를 모아두고, 모든 뷰컨트롤러에서 이를 상속받으면 편리해 보이지만, 기능이 많아질수록 점점 덩치가 커지고 유지보수가 어려워집니다.이 글에서는 그러한 문제를 해결하고자 “데코라이크”라는 구조를 소개하려고 합니다.문제 상황BaseViewController의 덩치가 커진다네비게이..

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에서 써볼려고 합니다. 구..