티스토리 뷰
안녕하세요 :) 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
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가 생길 수 있으면 호출을 못함
더 자세한 이야기는 밑에서 하겠습니다.
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 |
- np-hard
- 스위프트
- Xcode
- swift delegate
- IOS
- 회고
- np-complete
- swift sort
- swift3
- WWDC
- SwiftUI
- 피아노
- 제이슨 파싱
- Accessibility
- actor
- Git
- iOS delegate
- fastlane
- swift 공부
- UIBezierPath
- swift tutorial
- 스위프트 문법
- swift array
- ios 13
- Swift
- FLUTTER
- github
- Combine
- WKWebView
- WidgetKit
- Total
- Today
- Yesterday