
1. MemoStorageType
import Foundation
import RxSwift
protocol MemoStorageType {
@discardableResult
func createMemo(content: String) -> Observable<Memo>
@discardableResult
func memoList() -> Observable<[Memo]>
@discardableResult
func update(memo: Memo, content: String) -> Observable<Memo>
@discardableResult
func delete(memo: Memo) -> Observable<Memo>
}
- 메모 저장에 관련된 패턴을 명시하는 프로토콜 파일을 작성한다.
2. MemoryStorage
import Foundation
import RxSwift
class MemoryStorage: MemoStorageType {
private var list = [
Memo(content: "dummy1", insertDate: Date().addingTimeInterval(-10)),
Memo(content: "dummy2", insertDate: Date().addingTimeInterval(-20))
]
private lazy var store = BehaviorSubject<[Memo]>(value: list)
@discardableResult
func createMemo(content: String) -> RxSwift.Observable<Memo> {
let memo = Memo(content: content)
list.insert(memo, at: 0)
store.onNext(list)
return Observable.just(memo)
}
@discardableResult
func memoList() -> RxSwift.Observable<[Memo]> {
return store
}
@discardableResult
func update(memo: Memo, content: String) -> RxSwift.Observable<Memo> {
let updated = Memo(original: memo, updatedContent: content)
if let index = list.firstIndex(where: {$0 == memo}) {
list.remove(at: index)
list.insert(updated, at: index)
}
store.onNext(list)
return Observable.just(updated)
}
@discardableResult
func delete(memo: Memo) -> RxSwift.Observable<Memo> {
if let index = list.firstIndex(where: {$0 == memo}) {
list.remove(at: index)
}
store.onNext(list)
return Observable.just(memo)
}
}
- 앞서 작성했던 프로토콜을 준수하도록 실제 로직을 구현한다.
- 패턴 타입은
내부 배열 변경 - subject에서 next 이벤트 방출
- 그렇게 하는 이유는 테이블뷰와 연결 시, 새로운 이벤트를 방출해야만 테이블뷰가 업데이트되기 때문이다.