[swift]project_날씨App(2)

Jeff·2025년 1월 13일

# 네트워크 매니저

  • RxSwift와 Alamofire을 동시에 사용해 비동기 작업을 효율적으로 관리 할 수 있게되었습니다.

  • 하지만 두가지의 외부 라이브러리를 사용하기에 앱의 크기가 커질 수 있고 추가적인 관리가 필요하게 되는 단점이 될 수도 있습니다. 더해서 UrlSession보다 메모리 오버헤드가 발생할 수 있습니다.

  • 이제 api를 요청하기위해 url과 header에 원하는 쿼리 값을 넣어서 작성하면 요청 받을 수 있습니다.

  • 그렇게 받아온 JSON데이터를 Decodable을 통해 사용할 수 있게 하기위해서 아래와 같이 Codable을 채택한 구조체를 만들어주면 됩니다.

# 이슈

  • 작업을 하던 와중에 API요청이 한 종류만 이루어지면 된다고 생각을 했는데 추후 작업을 하다보니 다른 API도 필요성을 느껴져 구현을 했습니다.

  • 두 가지의 API에서 필요로 하는 데이터가 같고 JSON데이터 구조도 같기에 하나의 구조체로 사용할 수 있을 줄 알았는데 나중에 보니 위도와 경도를 반환하는 값들이 String과 Double타입으로 같이 쓸 수 없게 되었습니다.

  • 그래서 2가지 각각의 구조체로 만들려고 했지만 너무 비효율적이라고 생각해 다른 방법을 찾다보니 제네릭을 활용해 유연한 타입으로 상황에 맞는 값을 받아오면 된다는걸 알았고 그에 맞게 다시 리팩토링을 거쳤습니다.

  • 그래서 실제 어떤 데이터 타입이 들어갈지 미리 알려줌으로써 사용이 가능해졌습니다.

타입 명시

# 이슈

RxSwift를 사용해 이벤트를 받아 방출하게 구현을 하던 중 원하는 동작이 작동하지 않아서 log기록을 확인해가면 어떤 부분이 문제가 있는지 찾아보니 이벤트가 제대로 방출되지 않는걸 찾았습니다.

문제는 구독을 취소해주는 disposed에서 구독 취소가 제대로 동작하지 않아 발생했습니다.

처음에는 disposed(by: )에 들어가는 타입이 같아 의심없이 코드를 작성했지만 위 아래 코드의 차이는 생성이 되고 사라지는 시점에 차이가 있었습니다.

  • 임시로 disposeBag이 생성이 되었다가 곧바로 메모리에서 해제(즉 생성 및 스코프 영역에 문제)가 되어 즉시 구독을 취소하게 된다. 그래서 정상적으로 동작이 되지 않았습니다.

  • 변수에 선언해서 사용한다면 메모리에 올라가 유지가 되어 정상적으로 구독을 관리하게 된다고합니다.

profile
기본에 충실한 개발자가 목표!

0개의 댓글