일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- MainScheduler.asyncInstance
- 명품cppProgramming c++
- cleanarchitecture
- DependencyInjection
- data_structure
- combine
- GIT
- gitflow
- swift
- SwiftUI
- 코테
- CoreBluetooth
- IOS
- leetcode
- DispatchQueue
- Realm
- MethodSwilzzling
- SRP
- rxswift
- DynamicMemberLookup
- RaceCondition
- MainScheduler
- GCD
- SeSAC
- 프로그래머스
- DiffableDataSource
- 청년취업사관학교
- MainScheduler.Instance
- 등굣길
- 오픈채팅방
- Today
- Total
목록iOS (44)
Do.
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..
개요 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 서버라 하더라도) 를 호출하는 것은 문제점이 많습니다. 따라서 네트워크 모듈 단위 테스트를 실시할 때 어떤 방법이 있을지 알아보려고 합니다. 실제 네트워크 요청시 문제점 우선 네트워크 단위 테스트를 할 때 실제 네트워크를 요청하게 되면 어떤 문제가 있을까요? 물론 간단한 서비스의 경우는 실제 네트워크 요청이 일어나더라도 크게 문제 없을 수도 있습니다. 하지만 여러분이 하는 대부분의 서비스는 복잡하고, 무겁고 어려울 수 있습니다. 그러면..
Intro SwiftUI 프레임워크로 넘어오면서, 가장 불편했던 것 중 하나는 기존 UIViewController가 제공했던 ViewController Life Cycle이 SwiftUI View에는 없다는 것입니다. View Modifier에도 onAppear와 onDisappear가 존재하지만 기존 LifeCycle을 대체하기에는 부정확한 동작이 많았죠 특히나 didAppear와 didDisappear의 빈자리가 비교적 크게 느껴집니다. SwiftUI를 프로젝트에 적용하는 방법중에는 UIKit을 기반으로 HostingController를 활용하는 법과 순수 SwiftUI 베이스로 시작하는 방법이 있는데요! 이번에 설명드릴 방법은 SwiftUI 베이스에서 UIViewController의 Life Cyc..
Introduce 회사 업무로 코딩하다 보면 정말 많이 화가날 때가 있는데, 뷰가 너무너무너무 많아서 도대체 내가 지금 보고 있는 뷰의 이름이 뭔지 모를때가 있다. 비슷하게 생긴 뷰도 워낙 많고 하니, 단순히 피그마 디자인만 보고 뷰의 이름이 추측이 안될때가 있다. 기록이나 정의해 둔 문서가 따로 있다면 좋겠지만, 아마 대부분의 회사는 없을 것 같다. 그래서 보통 쓰는 방법이, 뷰 계층 디버거를 이용해서 이름을 알아 내는 방법인데, 이게 또 프로젝트가 너무 커서 그런가, 켜지는 데 시간도 오래 걸리고, 심지어 어떨 때는 계층 디버거가 켜지지도 않는다. 이럴때 진짜 매우 섬뜩하게 화가난다. 코딩할 시간도 부족한데, 뷰 이름이나 찾고 있어야 한다는게... 그래서 어떤 방법을 이용하면 좀더 쉽고 빠르게 찾을 ..
Introduce Result Type은 Swift 5에서 도입되어 SSL(Swift Standart Library)에 포함된 문법입니다. 동작의 수행 결과를 Success 인지 Failure인지 구분해서 나은 가독성과 코드 분기를 제공해줍니다. (개인 의견: 테스트 코드를 작성해본 사람은 알겠지만, try-catch에서 catch 아래는 코드 커버리지에 포함이 안되어서 미묘하게 킹받는데, 그런 사소한 부분을 해결해 주기도 한다.) 본 글은 Result Type을 반환값으로 쓰는 방법으로 Result Type 자체에 대한 내용은 다루지 않겠습니다. 왜 Return 값으로 Result Type을 쓰고싶었을까? Data Layer를 작성하다보면, 해당 비즈니스 모델에는 iOS 버전이나 라이브러리를 의존하고 ..
Intro Swift로 된 라이브러리를 구경하다 보면, Class의 @Attribute로 dynamicMemberLookup이라는 것이 붙은 것을 본 적이 있다. dynamicMemberLookup이 무엇인지, 어떻게 쓰이는지 알아보자 What is Dynamic member lookup 먼저 이것이 무엇인지만 간략하게 설명하자면 '실제 객체에 존재하지 않는 프로퍼티(멤버 변수)를 Dot Syntex로 접근하는 문법` 으로 몬 쌉소린가 싶습니다. 하지만 이 개념을 알고 난 뒤에는 똑같이 설명하게 되실 겁니다. 우선 당연한 예제를 하나 볼게요 struct Developer { let languages: [String: Int] } var henry = Developer(languages: [ "swift"..