분류 전체보기
[iOS-rxSwift] ReactorKit + RIBs
ReactorKit 이 state를 잡아주고 있다면 전반적인 structure를 잡아주는 RIBs 가 있다. 아직 어려워 많이 이해를 못했지만 Android와 iOS가 같은 구조를 가지고 크로스 플랫폼을 이룰 수 있으니 비지니스 로직을 서로간의 플랫폼에서 공유 할 수 있다는 장점도 있다. https://zeddios.tistory.com/937 RIBs란? 안녕하세요 :) Zedd입니다. 오늘은 RIBs에 대해서 공부해보려고 해요. 그동안 컨퍼런스/세미나에서..많이 들었었는데, 특히 민소네님에게! 본격적인 공부는 처음이네요. 오늘은 본격적인 튜토리얼 zeddios.tistory.com https://blog.mathpresso.com/ribs%EC%97%90-reactorkit-%EB%8F%84%EC%9..
[iOS-rxSwift] ReactorKit 기초
rxSwift를 접한 후 Clean Architecture를 찾아보다가 ReactorKit이라는 것을 알게 되었다. rxSwift 의 MVVM 구조를 단방향으로 쉽게 관리할 수 있도록 도와주는 프레임워크이다. 카카오에서도 이 프레임워크를 사용한다고 하니 rxSwift 를 사용할 때 알아두면 좋을 것 같다. 아래는 ReactorKit을 잘 설명해놓으신 블로거의 글이다. https://apple-apeach.tistory.com/19 [튜토리얼]ReactorKit 차근차근 사용해보기 안녕하세요 이번엔 전 포스팅에서 설명했었던 ReactorKit을 간단하게 사용해보는 튜토리얼 포스팅을 해보겠습니다. 혹시 이전 포스팅을 못보신 분이 계시다면 아래 링크를 참고해주세용 ReactorKit apple-apeach.t..
[iOS-Swift] Coordinator Pattern
iOS 개발을 하다 보면서 알게 된 화면 흐름을 관리하는 방법론 중 하나로 아래 링크를 통해 잘 설명된 것들을 볼 수 있다. rxSwift의 MVVM패턴에서 MVVM-C 패턴이라는 것은 MVVM + Coordinator Pattern 이였던 것이었다... 제일 기초적인 설명은 이 블로그에.. https://velog.io/@ellyheetov/Coordinator-Pattern Coordinator Pattern Coordinator 패턴의 시작 Coordinator란 화면전환을 위한 delegate이다. Stack 방식으로 새로운 화면을 push하고, 이전화면으로 돌아가가기 위해 pop한다. 가장 첫 화면을 기준으로 새로운 화면으로 넘어갈때 velog.io 좀더 알고싶다면 아래를.. https://ve..
[Swift] Alamofire 통신에서 캐시 사용 안하는 방법
프로젝트를 진행하다가 Get 통신 부분에서 Postman에서는 서버와 일치하는 값을 잘 응답하는데 Alamofire 의 응답 값에서는 최신화 된 값을 주는 것이 아니라 캐싱 된 값을 자꾸 주는 경우가 있었다. 그때 Alamofire의 캐시처리를 하지 않는 방법이다. AF.request(url, method: .get, parameters: params, encoding: UIREncoding.default, headers: requestHeader) .cacheResponse(using: ResponseCacher.doNotCache) // 이 부분을 넣어주자 (캐시사용안함) .responseDecodatble(of: String.self) { response in ... }
[Swift] UIScrollView 내 UITextView 의 Cursor 로 focus scroll 하는 방법
UIScrollView 안에 UITextView를 넣고 textView에 포커싱을 올리면 키보드에 가려져 스크롤을 해야하는 번거로움이 있다. 그럴경우 아래와 같은 코드를 사용해보자. // UITextViewDelegate 내 override 함수에 활용 func textViewDidChange(_ textView: UITextView) { let deadlineTime = DispatchTime.now() + .milliseconds(100) DispatchQueue.main.asyncAfter(deadline: deadlineTime) { if let cursorPosition = textView.selectedTextRange?.end { let caretPositionRect = textView.c..
[Swift] ScrollView 에서 Button Highlight Delay가 생길 때
스크롤 뷰 내에 버튼 생성 시 Highlight가 딜레이가 생기는 경우가 있다. 스크롤과 버튼과의 제스처 간 충돌이기에 스크롤뷰 내 콘텐츠에 대해 딜레이를 없에고 싶으면 다음을 사용하면 된다. scrollView.delaysContentTouches = false
[Swift] CLLocationManager.locationServicesEnabled() Issue 문제
Xcode 14.0 업그레이드 후 iOS 16 기기에서 CLLocationManager.locationServicesEnabled() 사용 후 문제점 This method can cause UI unresponsiveness if invoked on the main thread. Instead, consider waiting for the -locationManagerDidChangeAuthorization: callback and checking authorizationStatus first. 해결방안 CLLocationManager.locationServicesEnabled() -> CLLocationManager.authorizationStatus 활용 lazy var locationManager:..
![[rxSwift] TimeBased Operator 의 종류](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2F0XN6b%2FbtrPJWU7MMH%2FAAAAAAAAAAAAAAAAAAAAAOdcsN1_WkPQhy7dWUkktEHwTdVqLH9ElzAFtJpv3B0W%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1759244399%26allow_ip%3D%26allow_referer%3D%26signature%3DX7UpQl%252BUqG3BLF%252BmtzswdFkNy%252BE%253D)
[rxSwift] TimeBased Operator 의 종류
TimeBased Operator 의 종류 replay 구독자가 과거의 요소들을 자신이 구독하기 전에 나왔던 이벤트들을 버퍼의 갯수만큼 최신 순서대로 받게 함. replay관련 연산자를 사용할 땐 꼭 connect()로 연결해주어야 함. replay(bufferSize)에 1을 작성했다면 구독 전 가장 최신으로 배출된 item 1개를 받음. let hi = PublishSubject() let parrot = hi.replay(1) parrot.connect() hi.onNext("hi") hi.onNext("hello") parrot .subscribe(onNext: { print($0) }) .disposed(by: disposeBag) hi.onNext("good") // hello // good ..
![[rxSwift] Combining Operator 의 종류](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FcRddOn%2FbtrPmEHwshP%2FAAAAAAAAAAAAAAAAAAAAAAGf6VGr9rfYuRFP05TRgm0trQNeeqt6Pp9qpxwnG_X3%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1759244399%26allow_ip%3D%26allow_referer%3D%26signature%3D16c6QmjyiVEABjPYZ6R38uu6mzQ%253D)
[rxSwift] Combining Operator 의 종류
Combining Operator 의 종류 startWith Observable 시퀀스 앞에 새로운 초기값을 추가함. var disposeBag = DisposeBag() let classRoom = Observable.of("student1","student2","student3") classRoom .starWith("teacher") .subscribe(onNext: { print($0) }) .disposed(by: disposeBag) // teacher // student1 // student2 // student3 concat 같은 데이터 타입의 요소를 갖는 두개의 Observable들을 묶을 때 사용함. var disposeBag = DisposeBag() let first = Observ..
![[rxSwift] Transforming Operator 의 종류](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FcUVvcj%2FbtrPa9NRs11%2FAAAAAAAAAAAAAAAAAAAAALTO9wMy0UYgB62RGvItDLIWvkyxZH_9XAdvNoAWw74p%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1759244399%26allow_ip%3D%26allow_referer%3D%26signature%3D%252F2a6r5w1KrIS6Mf%252BJZLT9TqygDE%253D)
[rxSwift] Transforming Operator 의 종류
Transforming Operator 의 종류 toArray Observable의 독립적 요소들을 array로 만드는 연산자. (Singe 형태로 변환됨) 옵저버블이 방출하는 모든 이벤트를 completed 시점에 배열로 방출함. let disposeBag = DisposeBag() Observable.of("A", "B", "C") .toArray() .subscribe(onNext: { print($0) }) .disposed(by: disposeBag) // [A, B, C] // completed let disposeBag = DisposeBag() let subject = PublishSubject() subject .toArray() .subscribe{ print($0) } .dispose..