타이머(스톱워치) 생성 / 삭제 | 시작 / 일시정지 / 정지 | 완료 / 재시작 | 정렬 |
---|---|---|---|
다중 시작 / 일시정지 / 정지 / 삭제 | 활성화된 타이머 필터링 | 재시작시 남은 시간 불러오기 | 다크모드 커스텀 컬러 적용 |
---|---|---|---|
- MVVM binding tool로 RxSwift 사용 (+ RxCocoa, RxAppState)
- ViewType, ViewModelType을 추상화한 MVVMInterface 프로토콜 적용하여 Input - Output 구조 통일
-
ManagedObjectConvertible, ModelConvertible 프로토콜을 통해 Model(Domain Layer) <-> NSManagedObject(Data Layer) 객체간 Mapping
-
CoreDataStorage 구현하여 Background Context에서 CRUD 수행 (U를 제외한 CRD는 제네릭을 활용하여 코드 재사용)
-
타이머 실행 중 앱 종료 후 재시작해도 이전 실행 상태를 복구 (이전 실행 시점과 재시작한 시점의 시간차 계산)
- English
- Korean
- Japanese
- Chinese(Simplified)
Multimer/
├── Application/
│ ├── AppDelegate.swift
│ └── SceneDelegate.swift
├── Data/
│ ├── Persistence/
│ │ └── CoreData/
│ │ ├── CoreDataStorage/
│ │ │ ├── CoreDataStorage+TagColorMO.swift
│ │ │ ├── CoreDataStorage+TagMO.swift
│ │ │ ├── CoreDataStorage+TimeMO.swift
│ │ │ ├── CoreDataStorage+TimerMO.swift
│ │ │ └── CoreDataStorage.swift
│ │ ├── ManagedObjectSubclass/
│ │ │ ├── TagColorMO+CoreDataClass.swift
│ │ │ ├── TagMO+CoreDataClass.swift
│ │ │ ├── TimeMO+CoreDataClass.swift
│ │ │ └── TimerMO+CoreDataClass.swift
│ │ ├── Protocol/
│ │ │ ├── ManagedObjectConvertible.swift
│ │ │ └── ModelConvertible.swift
│ │ └── TimerModel.xcdatamodeld/TimerModel.xcdatamodel
│ └── Repository/
│ ├── Protocol/
│ │ └── TimerPersistentRepository.swift
│ └── CoreDataTimerRepository.swift
├── Domain/
│ ├── Model/
│ │ ├── Factory/
│ │ │ ├── TimeFactory.swift
│ │ │ └── TimerFactory.swift
│ │ ├── Tag.swift
│ │ ├── TagColor.swift
│ │ ├── Time.swift
│ │ └── Timer.swift
│ └── UseCase/
│ ├── Protocol/
│ │ ├── MainUseCase.swift
│ │ └── TimerUseCase.swift
│ ├── CountDownTimerUseCase.swift
│ ├── CountUpTimerUseCase.swift
│ └── DefaultMainUseCase.swift
├── Presentation/
│ ├── Support/
│ │ ├── Common/
│ │ │ ├── PaddingButton.swift
│ │ │ └── SymbolImageButton.swift
│ │ ├── Enum/
│ │ │ ├── CustomColor.swift
│ │ │ ├── EditViewButtonType.swift
│ │ │ ├── TimeType.swift
│ │ │ ├── TimerFilteringCondition.swift
│ │ │ ├── TimerTableViewSection.swift
│ │ │ └── TimerType.swift
│ │ ├── Extension/
│ │ │ ├── TimerTableViewDiffableDataSource+Rx+update.swift
│ │ │ ├── UIImage+makeSFSymbolImage.swift
│ │ │ ├── UIPickerView+setFixedLabels.swift
│ │ │ ├── UIStackView+addArrangedSubviews.swift
│ │ │ ├── UITextField+Rx+textChanged.swift
│ │ │ ├── UITextField+addLeftPadding.swift
│ │ │ └── UIView+snapshotCellStyle.swift
│ │ ├── Factory/
│ │ │ └── TagColorFactory.swift
│ │ ├── Protocol/
│ │ │ ├── CellIdentifiable.swift
│ │ │ └── MVVMInterface.swift
│ │ └── Constant.swift
│ ├── Main/
│ │ ├── MainViewController.swift
│ │ ├── MainViewModel.swift
│ │ ├── CustomView/
│ │ │ ├── EmptyTimerView.swift
│ │ │ ├── FilteringNavigationTitleView.swift
│ │ │ └── TimerEditingView.swift
│ │ └── TimerTableView/
│ │ ├── TimerTableViewDelegate.swift
│ │ └── TimerTableViewDiffableDataSource.swift
│ ├── TimerCreate/
│ │ ├── TimerCreateViewController.swift
│ │ └── TimerCreateViewModel.swift
│ ├── TimerSetting/
│ │ ├── TimerSettingViewController.swift
│ │ ├── TimerSettingViewModel.swift
│ │ ├── CustomView/
│ │ │ ├── TagButton.swift
│ │ │ └── TagScrollView.swift
│ │ └── TimePickerView/
│ │ ├── TimePickerView.swift
│ │ ├── TimePickerViewDataSource.swift
│ │ └── TimePickerViewDelegate.swift
│ └── TimerViewCell/
│ ├── TimerCellViewModel.swift
│ └── TimerViewCell.swift
├── Localizing/
│ ├── en.lproj/
│ │ ├── InfoPlist.strings
│ │ └── Localizable.strings
│ ├── ja.lproj/
│ │ ├── InfoPlist.strings
│ │ └── Localizable.strings
│ ├── ko.lproj/
│ │ ├── InfoPlist.strings
│ │ └── Localizable.strings
│ ├── zh-Hans.lproj/
│ │ ├── InfoPlist.strings
│ │ └── Localizable.strings
│ └── LocalizableString.swift
├── Info.plist
└── Localizable.strings
- 1.0.1
- 마케팅 URL이 추가되었습니다.