ReactiveX에서는 observable stream이 있는 비동기 프로그래밍 API를 제공합니다. 다시말해, 비동기 프로그래밍입니다.

 

예를 들어, 사용자가 프로그램을 사용할 경우 ViewController 내부의 클래스들이 순서대로 동작하는 것이 아니라,

사용자의 입력인 외부적 요인에 따라 코드의 순서가 다르게 실행될 것입니다.

 

RxSwfit는 ReactiveX를 Swift로 구현한 것입니다.

 

Observable

  • 이벤트에 대한 방출(Emit)을 합니다.
  • subscribe를 하지 못합니다. 따라서 이벤트를 방출할 수만 있습니다. 이벤트에 대한 처리가 불가합니다.

Observer

  • Observable에서 방출된 이벤트를 처리합니다.
  • 전달받은 event를 다른 Observer에게 전달하지 못합니다.

상단에서 언급한 Observable과 Observer를 통해 데이터의 흐름(Stream)을 통제 가능합니다. 이때, Operator를 통해 Stream을 변경, 조작할 수 있습니다.

 

Stream

  • 시간에 따라 값이 달라지는 형태를 의미합니다.

Subsribe

  • Observable에서 방출된 event를 처리하기 위해서 subscribe, 즉 구독을 해야 합니다.
  • Observable을 구독을 하기 전까지는 event가 방출이 되더라도 아무 일도 발생하지 않을 것입니다.

Observable Sequence

  • 유한한 시퀀스와 무한한 시퀀스가 존재합니다.
  • creat 연산자를 통해 Observable을 생성합니다.
  • subscribe가 되었을 때, Observable이 실행됩니다.
  • next를 통해 event를  emit합니다.
    • LifeCycle 중 오류가 발생할 경우 error  이벤트를, 정상적으로 완료가 될 경우 completed를 Notification됩니다.
    • deinit이 되는 시점, 시퀀스가 종료되는 시점에 Dispose가 됩니다.
    • 시퀀스가 종료된 이후에는 더 이상 이벤트가 발생하지 않습니다.
    • Infinite Observable Sequence
      • 무한한 시퀑스입니다. 이벤트 전달에 있어 끝이 존재하지 않습니다.
      • 예를 들어, UI와 관련한 이벤트입니다.
      • 사용자아 무엇을 입력하고, 클릭을 하더라도 반응을 끊임없이 제공해야 합니다.
      • 따라서 사용자의 입력에 대한 화면 전환이 끊임없이 발생합니다.
    • Finite Observable Sequence
      • 유한한 시퀀스입니다. 이벤트 전달에 있어 끝이 존재합니다.
      • 예를 들어, 대용량의 프로그램을 다운받로드받는 경우가 있습니다.
      • 사용자가 파일에 대한 다운을 요청할 경우, 파일을 모두 다운로드를 받게 되면 이벤트에 대한 처리가 종료됩니다.

 

 

https://reactivex.io/documentation/observable.html

 

ReactiveX - Observable

Observable In ReactiveX an observer subscribes to an Observable. Then that observer reacts to whatever item or sequence of items the Observable emits. This pattern facilitates concurrent operations because it does not need to block while waiting for the Ob

reactivex.io

부족한 부분이 많은 글이니 잘못된 정보에 대해 댓글 부탁드립니다!

'iOS' 카테고리의 다른 글

[trouble shooting] XML Data Parse하기! [feat. SWXMLHASE 사용기]  (0) 2024.03.23

안녕하세요, 서서씨입니다!

오늘은 당연을 개발하며 제가 겪얶던 어려움에 대해 공유해 보고자 합니다.

 

우선, 저는 Swift를 학습하며 API 통신을 통해 받아 온 데이터의 형식이 모두 JSON 형식이었습니다.

이러한 경우에, URLSession과 Alamofire등을 사용을 하여 어렵지 않게 데이터에 대한 처리가 가능했습니다.

 

그런데... 제가 사용한 API에서는 데이터를 XML 타입으로 제공을 하고, 별도의 파싱 과정을 통해 데이터 사용이 가능했습니다.

그나저나 파싱은 무엇을 의미할까요?

 

Parsing

구글에 검색해 보았는데요... 그렇다고 합니다. 와닿지가 않으니 구체적으로 무슨 의미인지 더 깊게 알아보도록 하겠습니다.

파싱은 데이터를 특정 패턴이나, 순서로 추출하여 정보로 가공하는 것을 말한다고 해요.

그렇다면 예시를 함께 알아보도록 해요.

 

예시의 XML 파일을 모델로 분리하여 사용하기 위햐서는 XML 데이터를 별도로 Parsing을 하는 과정이 요구됩니다.

이때, 저는 데이터의 Parsing을 위해 오픈 소스 라이브러리인 SWXMLHASH를 사용해 주었습니다.

SWXMLHASH

https://github.com/drmohundro/SWXMLHash

 

GitHub - drmohundro/SWXMLHash: Simple XML parsing in Swift

Simple XML parsing in Swift. Contribute to drmohundro/SWXMLHash development by creating an account on GitHub.

github.com

공식문서에서는 SWXMLHash는 Swift에서 XML을 구문 분석하는 비교적 간단한 방법이라고 소개를 하고 있습니다.

Alamofire를 통해서 통신을 진행합니다. 이때, 성공적인 통신이 이루어질 경우 데이터를 Pasre를 진행하도록 했습니다.

코드의 가독성을 위해 저는 별도의 함수로 로직을 분리해 둔 상태입니다.

데이터를 parse하는 함수의 내부입니다.

XML 데이터를 인자로 전달을 받습니다. 전달받은 Xml 데이터의 boxofs, boxof 접근을 합니다.  즉, 상위의 태그에 접근을 하는 것입니다.

이렇게 요소에 접근을 , 요소 내부의 하위 항목들을 바인딩하여 값을 저장한 , 해당 데이터드를 구조체에 저장해 주는 과정을 거쳐 주어 데이터를 parse 가능합니다.

 

더욱 다양한 방법에 대해 댓글 남겨 주시면 학습 후 업로드 진행해 보도록 하겠습니다!

🤓

'iOS' 카테고리의 다른 글

Observable vs Operator  (0) 2024.03.25

이슈

collectionView의 높이를 고정한 상태에서 출연자의 정보를 제공할 때, 출연자 정보가 많으면 뷰를 스크롤을 해야 한다. 반대로 출연자의 정보가 존재하지 않을 경우에는 잉여 공간을 차지했다.

고민한 내용

collectionView의 크기가 모두 정해질 시점에 크기를 다시 그릴 수는 없을지에 대해 고민해 보았다.

collectionView.contentSize.height 를 viewDidLoad, ViewWillAppear, ViewDidAppear, CellForItemAt 등에서 출력을 해 보았다.

 

CellForItemAt 이후에 레이아웃이 잡혀야 했으며, ViewDidAppear에서보다는 빠른 시점을 찾아야 했다. (뷰의 크기가 변경되는 것이 가시적으로 보였다. 어느 시점에 View를 라사이징할지 고민을 하다가 블로그를 발견을 했다

viewWillLayoutSubViews이다. view 의 레이아웃이 결정되기 직전인 시점으로, 이때 collectionView.contentSize.height 를 리사이징을 하면 원하는 크기로 collectionView의 레이아웃이 결정되는 것을 발견할 수 있었다!

회고

그런데 아직은 Drawing Cycle을 정확하게 학습했다고는 이야기할 수 없는 상태라 이 부분에 대해 추후에 학습하고 포스팅을 하도록 하겠다 . . . 혹시 제가 잘못된 방법으로 접근을 했다면? 댓글 남겨 주시면 감사하겠습니다 📖

 

레이아웃 관련 메서드를 탐구한 블로그

https://insubkim.tistory.com/337

  • 개발 진행 상황
  • Table에 저장된 데이터 CalendarView에 띄워 주기
  • Calendar Cell 커스텀
  • Calendar Cell 클릭 시 남긴 리뷰에 대한 요약 정보 제공
  • DetailView에 Detail 정보 출력 [Ing]

이슈

-----
  • MVVM  구조를 통해 데이터를 저장하고 싶은데 구조상 가장 상단의 데이터만 저장이 되고, Link, Embeded된 데이터는 저장이 되지 않는다  🥹

고민한 내용

  • 가장 상단?의 데이터인 Ticket을 가장 먼저 저장한 뒤, 추가적으로 다음 데이터들을 가장 마지막에 저장된 ticket을 불러와 저장해 주면 될 것이라고 생각했는데 생각처럼 데이터가 저장이 되지 않았다 . . . 😇

회고

  • XML Parse부터 Realm까지 데이터를 저장하는 과정이 생각보다 쉽지 않았다. 데이터의 구조를 계획을 하고 프로젝트를 만들기 시작했으나, 계속해서 구조를 변경해야 하는 과정을 거쳤어야 했다. CRUD 및 MVVM구조에 대한 추가적인 학습이 필요하다!!

TODO

  • Detail View 그리기
  • 메인 View 그리기
    • 탑 5 포스터
    • 뮤지컬
    • 공연
    • 지역별
    • 오늘
    • 주차별
    • 포스터 선택 시 Detail View로 이동하기

'개발 일지' 카테고리의 다른 글

[당연] Pagenation  (0) 2024.03.19
[당연] BottomSheet  (0) 2024.03.16

개발 진행 상황

  • Search View Cotnroller Pagenation 구현
  • PanModal 라이브러리 테스트
  • CalnderView 예제 데이터 출력

이슈

  • Search VC에 전달되는 API의 데이터의 total 개수가 제공되지 않아 paging에 대한 조건문을 작성하는 것에 대해 고민

고민한 내용

화면에 첫 진입 시, 10개(row)의 데이터가 화면에 저장이 된다! 
그리고 화면이 스크롤이 되고, 셀이 재사용이 되면 paging이 될 텐데,
이때 새로운 데이터를 받아와 배열에 저장해 주어야 한다...?!
그렇다면 paging을 하기 위한 조건이 필요로 될 것이다!

 

우선 나는 MVVM 패턴을 적용하여 사용 중임을 밝힘!

일단, TableView를 사용하게 될 경우에는 UITableViewDataSourcePrefetching 프로토콜을 채택해야 한다. 

공식문서를 우선 기재!

 즉, 문서의 해석으로 접근하자면 코드상에서 셀의 경로가 dataList.count - 3 == item.row이라면 

prefetch 데이터를 준비하면 될 것이다!

extension YourViewController: UITableViewDataSourcePrefetching {
    func tableView(_ tableView: UITableView, prefetchRowsAt indexPaths: [IndexPath]) {
        for item in indexPaths {
            if dataList.count - 3 == item.row && isEnd == true {
          	    필요에 따라
                내용 작성 
            }
        }
    }
}

또한 무한 스크롤을 예방하기 위해 prefetching을 종료하는 메서드를 함께 작성해 준다!

   func isEnd(row: Int, page:Int) -> Bool {
   isEnd 판단
    }

회고

나와 같은 경우에는... 전체 데이터의 개수가 제공되지 않고, page와 row데이터가 제공되었다. 이때, pagenation이 진행됨에 따라 page를 증가하고, 증가된 데이터를 계속하여 배열에 추가하며 데이터의 전체 개수를 얻어오는 방식을 택했다!!!

이전에 학습한 내용임에도 end조건은 개별적으로 구성해야 하니... 이러한 로직을 떠올리는 게 쉽지 않았다 ㅜ.ㅜ

유연한 사고를 하도록... 노력하기...!

TODO

  • CRUD 구성
  • 데이터 저장
  • ScrollView 구현

'개발 일지' 카테고리의 다른 글

[당연]CRUD  (0) 2024.03.21
[당연] BottomSheet  (0) 2024.03.16

개발 진행 상황

  • Calendar Date 선택 시 Bottom Sheet를 띄우기
  • 목업 데이터를 통해 데이터 목록 및 화면 전환 구현
  • FireBase Crashlytics 연결
  • Data 검색 View -> Detail View -> (Bottom Sheet) Add Memo View 화면 이동

이슈

  • PanModal 라이브러리의 샘플 코드를 이용하여 메모를 추가하는 View를 그리는데... 이때, 스크롤 뷰를 사용하지 않는다. dummy data를 출력하기 위해 View의 중앙에 테스트 레이블을 띄웠는데... 너무너무 아래에 레이블이 출력된다 😦
    var panScrollable: UIScrollView? {
        return nil
    }

 

고민한 내용

기기마다 출력되는 화면의 비율이 다르기 때문에 우선적으로 bottomSheet 영역을 화면비로 설정해 보았다.

    var longFormHeight: PanModalHeight {
        return .maxHeightWithTopInset(view.frame.height * 0.3)
    }

따라서 화면의 가장 하단도 frame의 비례한 곳일 것이라고 예측하고, 하단을 벗어나지 않도록 테스트를 해 보았다.

        label.snp.makeConstraints { make in
            make.bottom.equalTo(view).inset(view.frame.height * 0.3)
        }

iPhone 11 / iPhone 15 Simulator 

접근에 성공한 것 같다...!

이제 레이아웃들을 출력하며 메모를 저장하는 테스트를 시행할 예정!

 

회고

라이브러리 문서를 읽고 사용하는 방법을 발췌하는 일은 수월해지고 있는 것 같은데... 생각보다 코드에 녹여내는 일이 쉽지 않다! 🫠 다양하게 접근하는 방법을 탐구하기 위해 노력할 필요가 있겠다 . . . !

TODO

  • 정말정말 공수산정 최최최종... 으로 작성하여 체크해 보기!
  • dummy data 사용하지 않기!
  • detail view (대충이라도) 완성하여 데이터 출력!
  • 감상평 저장
  • Calendar에 저장된 데이터 보여주기!

'개발 일지' 카테고리의 다른 글

[당연]CRUD  (0) 2024.03.21
[당연] Pagenation  (0) 2024.03.19

+ Recent posts