일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- cleanarchitecture
- RaceCondition
- combine
- Realm
- SeSAC
- baseviewcontroller
- DependencyInjection
- 청년취업사관학교
- 프로그래머스
- MainScheduler.asyncInstance
- data_structure
- gitflow
- SwiftUI
- 명품cppProgramming c++
- leetcode
- MainScheduler
- DiffableDataSource
- rxswift
- MainScheduler.Instance
- MethodSwilzzling
- DynamicMemberLookup
- DispatchQueue
- 오픈채팅방
- swift
- CoreBluetooth
- 코테
- 등굣길
- SRP
- GCD
- IOS
- Today
- Total
목록iOS (45)
Do.

Intro Swift로 된 라이브러리를 구경하다 보면, Class의 @Attribute로 dynamicMemberLookup이라는 것이 붙은 것을 본 적이 있다. dynamicMemberLookup이 무엇인지, 어떻게 쓰이는지 알아보자 What is Dynamic member lookup 먼저 이것이 무엇인지만 간략하게 설명하자면 '실제 객체에 존재하지 않는 프로퍼티(멤버 변수)를 Dot Syntex로 접근하는 문법` 으로 몬 쌉소린가 싶습니다. 하지만 이 개념을 알고 난 뒤에는 똑같이 설명하게 되실 겁니다. 우선 당연한 예제를 하나 볼게요 struct Developer { let languages: [String: Int] } var henry = Developer(languages: [ "swift"..

Issue 서버에서 A.Request의 요청 결과를 받고 A의 결과에 따라 B.Request를 수행해야 하는 상황 Combine으로는 이를 어떻게 처리를 해야 할까 고민했습니다. A_Request.sink { _ in } receiveValue: { data in //processing B_Request.sink { _ in } receiveValue: { data2 in //processing + data2 processing } } 무식한 방법으로는 위와 같이, A_Request를 받고 내부에서 B_Request를 또 호출하는 방법이지만, 괜찮은 코드는 아닙니다. 코드 자체가 불필요한 뎁스를 가지기도 하고 가독성도 떨어지며, 두 기능을 분리하기가 쉽지 않네요. Solution 소개 드릴 기능은 Com..

문제 SwiftUI는 withAnimation으로 간단하게 애니메이션을 할 수 있는데, 종종 사라질 때 이 애니메이션이 작용하지 않는 듯한 모습을 보입니다. Tap을 하면 Circle은 자연스럽게 opacity Transition이 동작하는데, 글자는 나타날 때는 애니메이션이 잘 되는거 같은데, 사라질 때는 애니메이션이 동작하지 않는 것 처럼 뿅하고 사라집니다. 더보기 struct ContentView: View { @State var state: Bool = false var body: some View { VStack { Button { withAnimation { state.toggle() } } label: { Text("Tap \(state ? "On" : "Off")") } ZStack { C..

소개 Cache(캐시)는 컴퓨팅에서 데이터를 일시적으로 저장하는 것을 뜻한다. 어플리케이션에서 캐시는 요긴하게 쓰이는데, 예를 들어 네트워크 요청을 할 때, 한 번 요청한 결과에 대해서 캐시를 해두고, 다음에 해당 요청을 한번 더 할 때 네트워크 요청을 하지 않고 캐시에서 결과를 가져 올 수 있다. 정리하자면 아래와 같은 장점이 있다. 클라이언트에서는 요청 결과를 훨씬 더 빨리 화면에 보여줄 수 있다. 서버에서는 동일한 요청에 대해 동작을 중복 수행하지 않아도 된다. URLCache iOS에서 네트워크 요청을 하기 위해서는 URLSession이라는 API를 사용하는데, URLSession의 Task에는 대표적으로 몇가지 종류가 있다. DataTask DownloadTask Steam이나, Socket, ..
Combine을 사용할 때, debounce와 같은 오퍼레이터를 사용하면 scheduler를 지정해 주어야 한다. (그 외에도 scheduler를 지정해주는 상황) 이때 지정해 줄 수 있는 것은 RunLoop.main 과 DispatchQueue.main 인데 이 둘은 무슨 차이일까? query.debounce(for: .milliseconds(800), scheduler: RunLoop.main) query.debounce(for: .milliseconds(800), scheduler: DispatchQueue.main) 직접 실행해 보면 얼핏 차이가 없는 것처럼 보이지만 실제로는 중요한 차이가 있다. RunLoop.main 를 스케줄러로 사용하면 사용자의 터치 반응 등의 이벤트가 전달되지 않는다. 따..

Issue DiffableDataSource와 Realm을 함께 썼을 때 발생했던 문제와 해결법 DiffableDataSource는 Diff을 위해서 일종의 뷰의 상태를 가지고 있는데, 데이터가 변하면, 이전에 가지고 있던 상태와 비교해서 뷰를 갱신합니다. Storage에서 Object3이 삭제가 되고, snapshot을 재 구성해서 dataSource에 apply를 실행하게 되면, 이전 DataSource Snapshot과 비교해서, 화면을 갱신하는 상황입니다. 그런데 해당 과정에서 Realm 예외처리 오류가 발생합니다. RealmManager.shared.deleteTodo(todo: todo) print(dataSource.snapshot().itemIdentifiers(inSection: .Tas..
Bluetooth iOS에서는 BLE(Bluetooth Low Energy) 무선 기술을 CoreBluetooth 프레임워크를 통해 연결 가능하다. Central: Bluetooth 장치에서 데이터를 수신하는 개체 Peripheral: 다른 장치에서 사용할 데이터를 게시할 Bluetooth 장치 Advertising Packets: 블루투스는 Advertising Packets 형태로 가지고 있는 데이터 중 일부를 브로드캐스트 한다. 패킷에는 주변 장치의 이름, 기능 등과 같은 정보가 포함될 수 있다. Central의 역할은 이러한 AdvertisingPackets 을 스캔하고 관련이 있는 주변 장치를 식별하고 개별 장치에 연결하고 추가 정보를 확인한다. Service 주변 장치의 특정 기능 또는 특징을..