티스토리 뷰
안녕하세요 :) Zedd입니다.
오늘은 Combine Operator의 9번째 시간..Handling Errors 섹션입니다.
오늘 볼건 이렇게 4개에요.
assertNoFailure(_:file:line:)
1. 업스트림 Publisher가 실패하면 fatal error를 발생시키고
2. 그렇지 않으면 수신된 모든 입력을 republish하는 친구입니다.
예제를 봅시다.
subject.send(completion: Subscribers.Completion<Error>.failure(SubjectError.genericSubjectError))
제가 Publisher에 error를 명시적으로 보냈습니다.
그럼 실패했으니까..assertNoFailure()가 fatal error를 발생시키겠죠?
이렇게 fatal error를 발생시키기 때문에 테스트 및 출시 버전 모두에서 조심해야합니다.
Q : 어따써..?
A : 실패하면 fatal error를 일으키고 싶을때...???
...
ㅈㅅㅋ
근데 진짜 그럴때말고 쓸일 없을 듯 합니다..
catch(_:)
업스트림 publisher의 오류를 다른 publisher로 대체하여 처리.
에러가 났는데 그 에러를 다른 publisher로 처리할 때 catch를 쓰면 됩니다.
tryLast를 사용했습니다.
5
4
3
2
1
까지 가다가 0을 만나죠. 그리고 guard 조건에 만족하지 못하게 되어서 error를 냅니다.
근데 catch에서 해당 에러를 받습니다. 그리고 Just(-1)이라는 새로운 publisher를 만들어 리턴합니다.
결국 sink에서 -1이라는 값을 받게 됩니다.
쉽죠!?
tryCatch(_:)
try~친구들은 항상
업스트림 publisher의 오류를 다른 publisher로 바꾸거나 새 오류를 발생시켜 처리하는 친구입니다.
tryMap을 사용하여 숫자가 0보다 작으면 error를 던집니다.
-1에서 에러가 발생하게 되고, 그 다음 tryCatch로 들어가게 됩니다.
tryCatch의 정의가
1. 오류를 다른 publisher로 바꿈
2. 새 오류를 발생시켜 처리.
이잖아요? 여기서는 1번을 사용했네요. 오류를 다른 publisher로 만들었습니다.
그럼 2번을 봅시다.
tryCatch안에서 에러를 던진것을 볼 수 있죠!
error를 던질때, tryCatch안에서 리턴타입을 안써주면 에러가 나더라구요. 그래서 리턴타입도 명시해줬습니다.
catch에서 또 에러를 던지면 위 스트림은 아예 실패하게 되겠죠?
아무튼 이렇게 쓸 수 있다는거!!
retry(_:)
retry..다시 시도하다?
지정한 횟수까지 업스트림 publisher 구독을 다시 만들려고 시도하는 친구입니다.
보통 네트워킹에서 많이 쓰게 되는 것 같아요.
해당 URL이 valid하다면
sink에서 이런 값을 받을겁니다.
만약 "https://www.example.com2" 이런 valid하지 않은 URL을 넣으면 실패하게 될거고, catch에서
이런 출력을 찍게 되겠죠.
근데 여기서 주의깊게 봐야할건 retry(3)이 있다는겁니다.
print로 찍어보면,
처음 구독을 시작하고, valid하지 않으니 error를 받게 됩니다.
근데 retry가 있으므로
또 다시!!!! 구독을 요청하게 됩니다. (1번째 retry) 근데 또 실패했죠
(두번째 retry) 또 실패니까
(세번째 retry)
그럼에도 불구하고 실패이기 때문에 catch에 들어가게 됩니다.
그리고 스트림 종료.
유용하게 쓰일 수 있겠죠?
Handling Errors 섹션..계속 미루고 미루고...미루다...지금에서야 공부하네요.
하하
틀린부분이 있다면 댓글 남겨주세요!
'Combine' 카테고리의 다른 글
- 제이슨 파싱
- 회고
- Combine
- Swift
- ios 13
- 피아노
- np-complete
- np-hard
- Accessibility
- 스위프트
- SwiftUI
- actor
- swift array
- FLUTTER
- swift3
- swift delegate
- 스위프트 문법
- swift tutorial
- iOS delegate
- WidgetKit
- swift sort
- WKWebView
- UIBezierPath
- IOS
- fastlane
- WWDC
- github
- swift 공부
- Xcode
- Git
- Total
- Today
- Yesterday