⭐️ 개발

    [Rx] Combine Operator

    [Rx] Combine Operator

    Combine Operator startWith concat merge combineLatest zip withLatestFrom sample switchLatest reduce -> transform 가장 마지막에 있음 startWith 옵저버블 시퀀스 앞에 새로운 요소를 추가 // MARK: - startWith : 옵저버블 시퀀스 앞에 새로운 요소를 추가 let num = [1,2,3,4,5] // 기본값이나 시작값 지정시 활용 Observable.from(num) .startWith(9999) // 2개 이상 연달아 사용 가능 .startWith(1111, 2222) .startWith(3333) .subscribe { print($0) } .disposed(by: bag) // Last In F..

    [Rx] Transform Operator

    [Rx] Transform Operator

    Transform Operator toArray map compactMap flatMap flatMapLatest flatMapFirst concatMap buffer window groupBy scan (reduce까지) toArray 원본 옵저버블이 방출하는 모든 요소를 하나의 배열로 바꿔서 방출해줌 // MARK: - toArray : 원본 옵저버블이 방출하는 모든 요소를 하나의 배열로 바꿔서 방출해줌 let numbers = [1,2,3,4,5,6,7,8,9,10] let subject = PublishSubject() subject .toArray() // single로 변환, 하나의 요소로 변환 .subscribe { print($0) } .disposed(by: bag) subject.onN..

    [Rx] Sharing Operator

    Sharing Operator share multicast, Connectable Observable publish replay, replayAll refcount share let bag = DisposeBag() let source = Observable.create { observer in let url = URL(string: "https://tistory.com")! let task = URLSession.shared.dataTask(with: url) { (data, response, error) in if let data = data, let html = String(data: data, encoding: .utf8) { observer.onNext(html) } observer.onComp..

    [Rx] Time Based Operator

    Time Based Operator interval timer timeout delay delaySubscription interval // MARK: - interval 지정된 주기마다 정수를 방출 // period : 반복주기 // scheduler : 정수를 방출할 스케줄러 // 지정된 주기마다 정수를 계속해서 방출한다. 즉, 무한한 시퀀스를 생성하는 것! -> 직접 dispose를 해줘야 함 // int를 포함한 모든 정수형식을 사용가능하다. let i = Observable.interval(.seconds(1), scheduler: MainScheduler.instance) let subscription1 = i.subscribe { print("1 >> \($0)") } // 별도로 종료시키는..

    [Rx] Conditional Operator

    [Rx] Conditional Operator

    Conditional Operator amb 여러 옵저버블 중에서 가장 먼저 이벤트를 방출하는 옵저버블을 선택하는 것 right 옵저버블이 left 옵저버블보다 먼저 방출됐기 때문에 left 옵저버블은 무시되고, rigth 옵저버블만 구독된다. 많은 서버 연결 시도 중 가장 먼저 응답을 준 서버와 통신하고 싶은 경우 사용한다. let bag = DisposeBag() enum MyError: Error { case error } let a = PublishSubject() let b = PublishSubject() let c = PublishSubject() // 소스 옵저버블이 2개로 제한될 경우 a.amb(b) .subscribe { print($0) } .disposed(by: bag) a.onN..

    [Rx] Filtering Operator

    Filtering Operator ignoreElement elementAt skip take debounce throttle filter single distinctUntilChanged ignoreElement // MARK: - IgnoreElements next 이벤트를 필터링하는 연산자 let friends = ["소깡", "디온", "방구"] Observable.from(friends) .ignoreElements() .subscribe { print($0) } .disposed(by: bag) //completed elementAt // MARK: - elementAt 특정 인덱스에 위치한 요소를 제한적으로 방출하는 연산자 Observable.from(friends) .element(at: ..

    [Rx] Create Operators

    Create Operators just, of, from range, generate repeateElement deferred create just, of, from import RxSwift let disposeBag = DisposeBag() let element = "🎀" // MARK: - just, of, from 옵저버블 생성에 사용한느 가장 단순하고 기초적인 세가지 연산자 // just는 파라미터로 전달한 걸 그대로 전달한다. // 🎀 Observable.just("🎀") .subscribe { event in print(event) } .disposed(by: disposeBag) // [1, 2, 3] Observable.just([1, 2, 3]) .subscribe { event i..

    [질문정리] 객체지향 프로그래밍

    0. 도입 그 전에, Swift가 어떤 특징을 갖는 언어인지 알아야 된다. ARC (따로 공부하자!) Compile 언어 빌드 전 컴파일 시점에 타입을 결정짓는 정적언어 → 그래서 타입 오류나면 빨간오류 뜸 덕분에 안전성이 높고, 대규모 프로그램 개발에 적합 함수형 프로그래밍 언어 함수를 일급객체로 보기 때문에, 함수 자체를 매개변수나 반환타입으로 사용 가능 프로토콜형 프로그래밍 언어 값타입의 구조체와 열거형, 프로토콜을 객체지향 프로그래밍 언어 1. 객체지향 프로그래밍 객체와 객체간의 관계를 설계하는 프로그래밍 객체지향 프로그래밍에서 중요한 키워드는 클래스, 객체, 프로퍼티(상태, 속성, 데이터), 메소드(행위, 동작, 메시지) 클래스는 객체를 구성하기 위한 틀이다. like, 붕어빵틀 - 팥붕어빵/슈..

    [질문정리] 클래스와 구조체(feat. 메모리영역, COW, Method Dispatch)

    https://huree-can-do-it.notion.site/feat-COW-Method-Dispatch-22178b012cdb4699b665bb27bb05278e

    Xcode Cloud 맛보기 (1차 해결-ci_scripts)

    Xcode Cloud 맛보기 (1차 해결-ci_scripts)

    1. Xcode Cloud가 뭔데용? 헤수몬이 언제 이거 좋다고,, 한 적이 있어 궁금해서 해보자해보자 했던 것... 함 공부 트라이 해봤다.. ➰ Xcode에 내장된 지속적인 통합 및 배포 서비스(CI/CD)로, Apple 개발자를 위해 특별히 제작되었습니다. 앱을 빌드하고, 병렬로 자동화된 테스트를 실행하고, 테스터에게 앱을 배포하고, 사용자 피드백을 보고 관리하는 데 도움이 되는 클라우드 기반의 도구를 통합하여 고품질 앱을 개발하고 배포할 수 있습니다. 라고 나와있다. 일종의 데브옵스 시스템, CI/CD? CI Continuous Integration 지속적 통합 한 줄로 개발 변경 사항을 꾸준히 커밋하고 병합하고 이 단계에서 테스트해보며 오류가 없는지 체크하는 것 단위 테스트 같은 자동화된 단계를..

    [Rx Operator 시리즈] 4. flatMap / flatMapFirst / flatMapLatest

    [Rx Operator 시리즈] 4. flatMap / flatMapFirst / flatMapLatest

    1. FlatMap 방출된 항목의 값이 바뀌면 새로운 항목을 방출한다. 원본 옵저버블이 방출한 값을 감시해서 최신값을 확인할 수 있다. 옵저버블로 변환되고 값이 업데이트 될 때마다 새로운 항목을 방출한다. 모든 옵저버블이 방출하는 걸 모아서 -> 최종적으로 하나의 옵저버블(Result Observable)을 리턴한다. 네트워크 호출에 자주 쓰인다. let redCircle = "🔴" let greenCircle = "🟢" let blueCircle = "🔵" let redHeart = "❤️" let greenHeart = "💚" let blueHeart = "💙" Observable.from([redCircle, greenCircle, blueCircle]) .flatMap { circle -> Obs..

    [Rx] NSObject+Rx 라이브러리

    [Rx] NSObject+Rx 라이브러리

    disposeBag 속성을 자동으로 추가해 주는 라이브러리 let bag = DisposeBag() 이 코드를 안써도 된다 이거지!! https://github.com/RxSwiftCommunity/NSObject-Rx GitHub - RxSwiftCommunity/NSObject-Rx: Handy RxSwift extensions on NSObject, including rx.disposeBag. Handy RxSwift extensions on NSObject, including rx.disposeBag. - GitHub - RxSwiftCommunity/NSObject-Rx: Handy RxSwift extensions on NSObject, including rx.disposeBag. github..

    [Rx Operator 시리즈] 3. Zip

    [Rx Operator 시리즈] 3. Zip

    combineLatest와 다른 점? : 클로저에게 중복된 요소를 전달하지 않고, 인덱스를 기준으로 짝을 맞춰서 전달. 첫 번째 요소는 첫 번째 요소와 결합 두 번째 요소는 두 번째 요소와 결합 세 번째 요소는 세 번재 요소와 결합 Indexed Sequencing이라고 함 결합할 요소가 없으면 방출하지 않음 let numbers = PublishSubject() let strings = PublishSubject() Observable.zip(numbers, strings) { "\($0) - \($1)" } .subscribe { print($0) } .disposed(by: disposeBag) numbers.onNext(1) strings.onNext("One") // next(1 - One) n..

    [Rx Operator 시리즈] 2. CombineLatest

    [Rx Operator 시리즈] 2. CombineLatest

    소스 옵저버블이 방출하는 최신 요소를 병합하는 combineLatest 연산자 소스 옵저버블들을 결합해 방출하는 최신 이벤트를 대상으로 연산자를 실행해 결과 옵저버블을 방출 enum MyError: Error { case error } let greetings = PublishSubject() let languages = PublishSubject() Observable .combineLatest(greetings, languages) { first, second -> String in return "\(first) \(second)" } .subscribe { print($0) } .disposed(by: disposeBag) greetings.onNext("Hi") languages.onNext("R..

    [Rx Operator 시리즈] 1. map

    map은 옵저버블이 배출하는 항목을 대상으로 함수를 실행하고 결과를 방출 map 연산자는 옵저버블이 방출하는 요소들을 대상으로 클로저를 실행하고 그 결과를 구독자에게 전달한다. 클로저 내에서 원하는 형식으로 바꿔서 리턴해 전달이 가능하다. let skills = ["Swift", "SwiftUI", "RxSwift"] Observable.from(skills) .map { $0.count } .subscribe { print($0) } .disposed(by: disposeBag) // 출력 next(5) next(7) next(7) let skills = ["Swift", "SwiftUI", "RxSwift"] Observable.from(skills) .map { "Hello, \($0)" } .su..