본문 바로가기

전체글167

[UIKit] CollectionView가 먼저 생성되고 데이터가 갱신되지 않는 문제 UIkit을 활용하여 코인리스트를 만드는 도전을 진행 중입니다. 블록와이드를 만들며 작업했던 흐름으로 @Publisher를 활용해서 winnerList 배열을 만들고 API로부터 데이터를 받아와서 업데이트 하는 구조인데요. 앱을 빌드하면 데이터를 받아오기 전에 비어있는 0 값이 출력되고 있으며, 그에 따라서 화면에는 코인리스트가 생성되지 않고 있습니다. SwiftUI에서는 @Publisher의 값이 수정되면 자동으로 값이 갱신되서 뷰가 새롭게 그려졌는데 UIKit에서는 다르게 작동하는 것 같네요. UI를 그리고 임시 리스트를 보여주는 것까지는 성공했는데 데이터를 갱신해주는 것에 대해서 공부를 해야하겠습니다. RxSwift가 그 힌트가 될 것 같아요. SwiftUI로는 업비트 웹소켓으로 매초마다 데이터를 .. 2023. 4. 7.
새로운 학습과 프로젝트 시작! SwiftUI로 진행하던 블록와이드를 작업하다가.. 결심하였다. UIKit으로 새로운 어플을 처음부터 다시 만든다. 코인겍코에서 받아오던 리스트를 업비트에서 받아오는 리스트로 교체하려고 하니 검색목록, 검색, 세부 화면 등 수정해야 할 것들이 한둘이 아니다. 거의 앱을 처음부터 다시 만드는 수준이다. 그런데 그러한 과정에서 크게 배우거나 도전할 과제가 있지는 않을 것 같았다. 최근까지 진행했던 업비트 RestAPI로 데이터 받아와서 뿌려주기, 웹소켓 API 활용하기, 실시간 데이터를 비동기 처리하기 등은 매우 도전적인 과제였고 새로운 학습이었다. 하지만 구현한 업비트 리스트를 기반으로 앱의 기능을 다시 만드는 것은 이미 해본 것들이었고, 코드가 유지보수가 어렵게 제작이 되어서 그런지 거의 새롭게 만드는 .. 2023. 3. 19.
결국 문제는 선택과 집중.. 요즘 들어 고민이 많아졌다. 앞으로의 선택과 집중에 대한 것.. 요즘 나는 뭘 했을까? 업비트에서 웹소켓 API를 활용해 실시간 데이터를 화면에 뿌려주는 것을 구현 성공했다. 이 과정에서 메인쓰레드에서 너무 많은 작업을 해서 버벅였던 문제를 해결했다. 또한 백그라운드에서 포어그라운드, 포어그라운드에서 백그라운드로 움직일 때 소켓의 연결/닫기를 호출하여 컨트롤 하는 것도 구현했다. 결과적으로 1초에 몇번이고 웹소켓을 통해 끊임없이 데이터를 받아오고 가공하고 저장하고 화면에 업데이트하는 작업이 발생하지만 전혀 버벅임 없이 부드러운 앱이 되었다. Swift Concurrency를 통한 동시적 프로그래밍에 대한 개념도 어제, 오늘 학습하게 되어서 공부해서 코드에 적용해 볼 부분이 많다. 요즘 계속 갖게 되는 고.. 2023. 3. 15.
동시성 프로그래밍 공부하며, 앱 성능 개선하기 요즘 동시성 프로그래밍을 공부하고 있다. CPU, 쓰레드, Queue, GCD 등등 며칠 전만해도 블록와이드를 개발하며 동시성 프로그래밍이 뭔지 몰랐다. 하지만 우연하게 동시성 프로그래밍에 대한 강의를 들으며 개념에 대해서 알게 되었고, 앱 개발을 하며 필요가 점점 부각되어서 동시성 프로그래밍에 대해서 공부하고 있다. 왜 공부하게 되었나 앱에서 Rest API로 정보를 가져올 때에는 내가 굳이 다른 **Queue로 작업을 보내지 않아도 충분한 성능이 나왔다. 웬만한 네트워크 작업은 URLSession등의 기본 기능으로 Queue로 보내 다른 쓰레드에서 연산하게 해준다. 또한 데이터를 가공하는 연산 작업도 가끔씩 한순간만 발생하다보니 굳이 작업을 다른 쓰레드로 보내지 않아도 앱이 버벅이지 않았다. 하지만 .. 2023. 3. 11.
URLSessionWebSocketTask로 업비트 WebSocket (웹소켓) 사용하기 어제 새벽까지 작업했던 첫번째 시도가 실패한 이후, 드디어 오늘 업비트 웹소켓 연결 이후 JSON 파싱까지 성공하였습니다! 어제 실패한 이유는 웹소켓에서 오는 데이터를 파싱하는 방식이 서툴렀기 때문이었어요. 예를 들어서 Json 파싱을 위한 Model을 살펴보면, 업비트의 RestAPI에서는 "KRW-BTC"가 market이라는 필드명을 가진 반면, WebSocket에서는 code라는 필드명을 가지고 있어요. 그래서 Model을 수정해야 했어요. 또한 트래픽이 많은 경우 사용하는 방법으로 축약형 필드명를 소개하고 있어서, Model의 코딩키를 축약형으로 바꿔야 했어요. 또 다른 어려웠던 점은, URLSessionWebSocketTask에서 receive의 Success 케이스에는 string과 data .. 2023. 3. 9.
RestAPI vs WebSocketAPI. 현재 해결해야 할 문제 블록와이드에 CoinGecko RestAPI로 받아오던 코인 정보를 업비트 RestAPI를 활용해 교체하려는 시도를 했습니다. 결과적으로는 성공하였습니다. 하지만 그리 만족스럽지는 못했는데요. 지금까지 작업한 코드는 아래와 같습니다. import Foundation import Alamofire import Combine class UpbitCoinDataService { @Published var coins = [UpbitCoin]() @Published var tickers = [UpbitTicker]() private let baseUrl = "https://api.upbit.com/v1" private var cancellables = Set() init() { fetchCoins() } priv.. 2023. 3. 7.