Service 파일에서 CRUD 코드 작성하기

RudinP·5일 전
0

Study

목록 보기
383/384

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))
    ] //Observable을 통해서 외부에 공개됨. 배열의 상태가 업데이트되면 새로운 next 이벤트 방출
    //따라서 Observable이 아닌 Subject로 만들어야 함
    
    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 이벤트 방출
    • 그렇게 하는 이유는 테이블뷰와 연결 시, 새로운 이벤트를 방출해야만 테이블뷰가 업데이트되기 때문이다.
profile
iOS 개발자가 되기 위한 스터디룸/스터디의 레퍼런스는 모두 kxcoding

0개의 댓글