반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Realtime Database
- dictionary
- Observable
- ios
- NavigationLink
- UITabBarController
- Apple
- Android
- Swift
- LazyHStack
- string
- WebView
- 웹뷰
- SwiftUI
- swipe
- github
- Firebase
- remote config
- 다크모드
- 문자열
- Alamofire
- autolayout
- UIButton
- Java
- subscript
- 라이트모드
- UIScrollView
- RxSwift
- SwiftLint
- gcd
Archives
- Today
- Total
점진적 과부하 개발 블로그
RxSwift 데이터 처리 본문
반응형
RxSwift 데이터 처리
private func bind() {
let blogResult = searchBar.shouldLoadResult
.flatMapLatest { query in
SearchBlogNetwork().searchBlog(query: query)
}
.share()
let blogValue = blogResult
.compactMap { data -> DKBlog? in
guard case .success(let value) = data else { return nil }
return value
}
let blogError = blogResult
.compactMap { data -> String? in
guard case .failure(let error) = data else { return nil }
return error.localizedDescription
}
// 네트워크를 통해 가져온 값을 cellData로 변환
let cellData = blogValue
.map { blog -> [BlogListCellData] in
return blog.documents
.map { doc in
let thumbnailURL = URL(string: doc.thumbnail ?? "")
return BlogListCellData(
thumbnailURL: thumbnailURL,
name: doc.name,
title: doc.title,
datetime: doc.datetime
)
}
}
// FilterView를 선택했을 때 나오는 alertsheet를 선택했을 때 type
let sortedType = alertActionTapped
.filter {
switch $0 {
case .title, .datetime:
return true
default:
return false
}
}
.startWith(.title)
// MainViewController -> ListView
Observable.combineLatest(
sortedType,
cellData
) { type, data -> [BlogListCellData] in
switch type {
case .title:
return data.sorted { $0.title ?? "" < $1.title ?? "" }
case .datetime:
return data.sorted { $0.datetime ?? Date() > $1.datetime ?? Date() }
default:
return data
}
}
.bind(to: listView.cellData)
.disposed(by: disposeBag)
let alertSheetForSorting = listView.headerView.sortButtonTapped
.map { _ -> Alert in
return (title: nil, message: nil, actions: [.title, .datetime, .cancel], style: .actionSheet)
}
let alertForErrorMessage = blogError
.map { message -> Alert in
return (
title: "앗!",
message: "예상치 못한 오류가 발생했습니다. 잠시 후 다시 시도해주세요. \(message)",
actions: [.confirm],
style: .alert
)
}
Observable
.merge(
alertSheetForSorting,
alertForErrorMessage
)
.asSignal(onErrorSignalWith: .empty())
.flatMapLatest { alert -> Signal<AlertAction> in
let alertController = UIAlertController(title: alert.title, message: alert.message, preferredStyle: alert.style)
return self.presentAlertController(alertController, actions: alert.actions)
}
.emit(to: alertActionTapped)
.disposed(by: disposeBag)
}
반응형
'RxSwift' 카테고리의 다른 글
RxSwift RxTest와 RxBlocking 알아보기 (0) | 2022.06.07 |
---|---|
RxSwift 에러 관리 (0) | 2022.05.28 |
RxCocoa 알아보기 (0) | 2022.05.27 |
RxSwift TimeBased Operator (0) | 2022.05.22 |
RxSwift Combining Operator (0) | 2022.05.20 |