티스토리 뷰

Combine

Combine + UIKit

Zedd0202 2020. 4. 19. 13:27
반응형

 

안녕하세요 :) Zedd입니다.

아 쓰는 글들이 왜이렇게 마무리가 안될까요 ㅡㅡ

 

아무튼 오늘은 제목에서 보실 수 있다시피..

Combine + UIKit 조합 ㅎ

 

1. 화면 시안을 받음

2. 사탄 : 아 이건 SwiftUI로는 좀..

3. 그래 UIKit으로 만들자!

꼭 SwiftUI 써야한다는 강박관념은 버리자 ^^! (왠지 모르게 자괴감이 듬)

4. 네트워킹 필요한데..Alamof..

5. 사탄 : 아 이걸 Alamofire쓰는 건 좀..

 

이건 그냥은 못넘어가겠음

암튼 이 흐름으로...Combine + UIKit 조합을 도전해보게 되었답니다 ㅎ

 

제가 하고싶은게 모냐면

 

1. API요청

2. "데이터"를 얻었다!

3. Decodable을 준수하는 타입으로 decoding

4. "배열"을 얻었다!

5. 응 UITableView에 뿌려줘야돼

==> 나는 API호출만 하고 응답받고 어쩌고 저쩌고 해서 TableView가 알아서 짠 하고 나왔으면 좋겠네...

 

그렇다면 배열을 줄........API가 필요하다. 

아니 그냥 나는 아무 배열을 주는 API가 필요한건데 왜 찾으면 없지

개귀찮

https://zeddios.tistory.com/957

 

Server-Side Swift with Vapor

안녕하세요 :) Zedd입니다. Swift로 Server를 만들어야 할 일이 생겨서요..! 공부해보려고 해요. 항상 하고싶었는데!!!!!!! 이렇게 할 수 있게 되어서 기분이 좋군요.. https://academy.realm.io/kr/posts/swift-s..

zeddios.tistory.com

Vapor에서 했으니까 걍 내가 만들어주겠음

흠 딱히 귀찮았던 흔적은 안보이는군요.

자 핵심코드는 별로 안어렵습니다..!

 

위 코드인데요, 

한줄씩 살펴볼게요.

url에 있는 데이터를 가져오는 코드는 위 코드입니다!

URLSession.shared.dataTask(with: url)은 익숙한데 

이건 dataTaskPublisher네요

dataTaskPublisher는 내가 준 URL에 대한 URL 세션 데이터 작업(URL session data task)을 래핑하는 publisher를 리턴합니다. 

publisher는 작업이 완료되면 데이터를 발행하거나, 실패하면 에러와 함께 종료되게 됩니다.

 

자 위에서 "데이터"를 얻었으니..

data를 가져와서 JSON Decoder에 넣어야겠죠!?

.map { $0. data } 로 해도 전혀 상관없지만 Swift 5.2에서 굳이 새로 나온 기능 써봄

그리고 밑에서도 keypath가 쓰일거라,...뭔가 일관성을 가져가고 싶었음 

 

바로 decode호출해줍니다. 

decode는 업스트림에서의 출력을 디코딩하는 아주 편한 친구입니다..😎

 

바꾸다 / 에러

맞습니다..업스트림에서 에러나면 나는 이걸로 바꿀래! 하는거임

사실 안해줘도 상관없지만...이제 나올 assign이라는 친구가 Error가 생길 수 있으면 호출을 못함 

더 자세한 이야기는 밑에서 하겠습니다.

 

\.self.dj는 왤케 못생겨보일까요

assign은 할당하다라는 뜻이죠? 

Publisher의 요소를 객체의 프로퍼티에 할당하는 친구입니다.

자 내가 data도 가져오고 그거 디코딩했으면 어디 저장해야될거 아냐;;;

저는 

여기에 저장할래! 해준거에요

 

보시다시피, 파라미터 2개를 받고 있는데요, 

to에는 keypath를 받습니다. 내가 할당할 프로퍼티의 keypath를 넣어주면 됩니다.

on은 object를 넣으면 되는데요. 값을 할당할 객체입니다.

dj는 지금 DJViewModel이 가지고 있으니까..그러니까 나 자신이 가지고 있으니까 self를 넣어주면 됩니다.

 

그 말뜻은...

자 지금은 DJViewModel에 dj가 있었는데요. 난 뭐 다른데다 넣고싶을 수 있겠죠???

예를들어

나는 뭐 ViewController에 직접 dj를 선언해써

 

그럼 이렇게 해주면 되는겁니다.

 

뭐 이런식으로 확인해보면 보실 수 있습니다?

 

자 그리고 위의 replaceError 안해주면 assign을 호출못한다고 그랬죠 

replaceError를 주석처리하면

이런 에러가 뜹니다.

그니까 ㅇ ㅑ 니가 assign 참조하고싶으면(호출하고 싶으면) Error랑 Never랑 타입이 같아야댐

절대 Error가 내려오지 않을것이다(?)를 명시해줘야 assign을 호출할 수 있다고 보면 될 듯

그래서 Error를 위에서 처리해줘야합니다. 그러니까 assign에서는 절대 Error가 내려오지 않겠죠.

데이터 발행에 실패하면 업스트림에서 [] < 라는 정상적인(?) 배열을 줄거니까요.

 

그리고 마지막 작업!

(이거 해줘야하는거 맞죠..?)

스트림을 cancelBag에 저장해줍니다.

위의 assign이 Cancellable 인스턴스를 리턴하기 때문이죠!

 

이렇게만 하면 UITableView가 예쁘게 잘 나오면 좋겠지만..

실행해보면 깨-끗

왜냐...reloadData를 해줘야하거든 ㅠ

 

자 그래서 이런 코드를 추가해주게 되었습니다. 

viewModel의 dj배열에 @Published가 붙어있기 때문에 이 친구를 구독할 수 있게 됩니다.

($는 property wrapper(예를들어 위에서 쓴 @Published나 @State같은거)의 인스턴스를 참조하는 방법입니다!)

 

receive를 해준 이유는

아무튼 이렇게 하면

잘 나옵니다.

 

 

ㅈㅏ 이렇게 Combine + UIKit을 해봤는데요

DiffableDataSource를 쓰면 뭐 dj를 subscribe하거나 그런걸 안해도 될 것 같긴 한데

(확실하지않음)

그냥 이렇게도 해봤다~ 라고만 봐주시면 감사하겠습니다!

이런식으로 말고 다른방법으로도 할 수 있으면 알려주세요!!

그리고 틀린내용이 있다면 댓글 달아주세요~~

 

반응형

'Combine' 카테고리의 다른 글

Combine ) multicast , share  (3) 2020.04.26
Combine ) ConnectablePublisher  (0) 2020.04.26
Combine (4) - Cancellable  (0) 2020.03.24
Combine (3) - Scheduler  (4) 2020.03.23
Combine (2) - Subject  (0) 2020.02.29