Skip to content

sanghyeok-kim/MultiTimer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

eaabade · Jan 11, 2023
Jan 11, 2023
Nov 2, 2022
Jan 11, 2023

Repository files navigation

직관적인 다중 타이머 & 스톱워치

Apple iPhone 11 Pro Max Screenshot 0 Apple iPhone 11 Pro Max Screenshot 1 Apple iPhone 11 Pro Max Screenshot 2 Apple iPhone 11 Pro Max Screenshot 3 Apple iPhone 11 Pro Max Screenshot 4

📌 Features

타이머(스톱워치) 생성 / 삭제 시작 / 일시정지 / 정지 완료 / 재시작 정렬
CleanShot 2023-01-11 at 00 04 54 CleanShot 2023-01-10 at 18 20 40 CleanShot 2023-01-10 at 18 22 16 CleanShot 2023-01-11 at 00 06 40
다중 시작 / 일시정지 / 정지 / 삭제 활성화된 타이머 필터링 재시작시 남은 시간 불러오기 다크모드 커스텀 컬러 적용
CleanShot 2023-01-11 at 00 26 48 CleanShot 2023-01-11 at 00 31 30 CleanShot 2023-01-11 at 00 15 15 CleanShot 2023-01-11 at 00 23 22

🛠 Project Tech Stack

Design Pattern - MVVM

  • MVVM binding tool로 RxSwift 사용 (+ RxCocoa, RxAppState)
  • ViewType, ViewModelType을 추상화한 MVVMInterface 프로토콜 적용하여 Input - Output 구조 통일

Persistence - Core Data

  • 모델 설계 및 관계도
    CleanShot 2023-01-10 at 17 39 05@2x

  • ManagedObjectConvertible, ModelConvertible 프로토콜을 통해 Model(Domain Layer) <-> NSManagedObject(Data Layer) 객체간 Mapping

  • CoreDataStorage 구현하여 Background Context에서 CRUD 수행 (U를 제외한 CRD는 제네릭을 활용하여 코드 재사용)

  • 타이머 실행 중 앱 종료 후 재시작해도 이전 실행 상태를 복구 (이전 실행 시점과 재시작한 시점의 시간차 계산)

Localizing

  • English
  • Korean
  • Japanese
  • Chinese(Simplified)

🗂 System Structure

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

📝 Release

  • 1.0.1
    • 마케팅 URL이 추가되었습니다.