cherrishRed / ios-diary

๐Ÿป iOS ์ปค๋ฆฌ์–ด ์Šคํƒ€ํ„ฐ ์บ ํ”„ ๐Ÿ“” ๋‹ค์ด์–ด๋ฆฌ

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

๐Ÿ“” ์ผ๊ธฐ์žฅ

ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„: 2022.06.13 ~ 2022.07.01 ํŒ€์›: ์šฐ๋กฑ์ฐจ, Red ๋ฆฌ๋ทฐ์–ด: ์›จ๋”

ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

๐Ÿ“” ์ผ๊ธฐ์žฅ ๋‚˜๋งŒ์˜ ์ผ๊ธฐ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์„ธ์š”! ์ €์žฅ์„ ๊นœ๋นกํ•˜์…จ๋‹ค๊ตฌ์š”? ๊ฑฑ์ • ์—†์Šต๋‹ˆ๋‹ค. ์ž๋™์ €์žฅ ๋ฉ๋‹ˆ๋‹ค!

ํƒ€์ž„๋ผ์ธ

  • ์ฒซ์งธ์ฃผ : ํ™”๋ฉด๊ตฌ์„ฑ, ํ‚ค๋ณด๋“œ, Core Data CRUD ๊ตฌํ˜„
  • ๋‘˜์งธ์ฃผ : Core Data๋ฅผ ์ด์šฉํ•œ ๊ธฐ๋Šฅ ๊ตฌํ˜„, TableView ์„ธ์„ธํ•œ ๋™์ž‘๊ตฌํ˜„, alert ๊ตฌํ˜„
  • ์…‹์งธ์ฃผ : ๋„คํŠธ์›Œํ‚น์„ ํ†ตํ•˜์—ฌ ๋‚ ์”จ์ •๋ณด ๋ฐ›์•„์˜ค๊ธฐ ๋ฐ ์ด๋ฏธ์ง€ ์‚ฝ์ž…

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

ํ”„๋กœ์ ํŠธ ์‹คํ–‰ ํ™”๋ฉด

๐Ÿš€ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

STEP1

  • ํ‚ค๋ณด๋“œ ์˜ฌ๋ผ์˜ค๊ณ  ๋‚ด๋ ค๊ฐ€๋Š”๊ฑฐ์— ๋”ฐ๋ฅธ View ๋ณ€๊ฒฝ
  • iOS ๋‚ฎ์€ ๋ฒ„์ „ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ์‹คํ–‰

ํ‚ค๋ณด๋“œ ์˜ฌ๋ผ์˜ค๊ณ  ๋‚ด๋ ค๊ฐ€๋Š”๊ฑฐ์— ๋”ฐ๋ฅธ View ๋ณ€๊ฒฝ

๐Ÿค”๋ฌธ์ œ ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ํ‚ค๋ณด๋“œ ๊ด€๋ จํ•˜์—ฌ ๋ ˆ์ด์•„์›ƒ์„ ์ฃผ๋ฉด textFied ๋‚˜ textView ๊ฐ€ ํ‚ค๋ณด๋“œ์— ๊ฐ€๋ ค์ง€์ง€ ์•Š๊ฒŒ ์•Œ์•„์„œ bottom ๋ ˆ์ด์•„์›ƒ์„ ์ˆ˜์ •ํ•œ๋‹ค.

textView.bottomAnchor.constraint(equalTo: keyboardLayoutGuide.topAnchor).isActive = true

ํ•˜์ง€๋งŒ ์œ„์˜ ๊ธฐ๋Šฅ์€ iOS 15๋ฒ„์ „๋ถ€ํ„ฐ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ฎ์€ ๋ฒ„์ „์—์„œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์•˜๋‹ค.

๐Ÿ˜†ํ•ด๊ฒฐ if #available(iOS 15.0, *)๋ฅผ ์‚ฌ์šฉํ•ด์„œ iOS 15.0 ๋ณด๋‹ค ๋ฒ„์ „์ด ๋‚ฎ๋‹ค๋ฉด, Notification์„ ์ด์šฉํ•ด ํ‚ค๋ณด๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ, ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ์•„๋ž˜์˜ ์˜คํ† ๋ ˆ์ด์•„์›ƒ์„ ์ ์šฉํ•ด ์ฃผ์—ˆ๋‹ค.

textViewBottomConstraint = textView.bottomAnchor.constraint(
            equalTo: safeAreaLayoutGuide.bottomAnchor,
            constant: -height // ์—ฌ๊ธฐ์„œ height ๋Š” ํ‚ค๋ณด๋“œ์˜ ๋†’์ด
        )

์ด๋•Œ ๊ธฐ์กด์— ์ ์šฉ๋œ ์˜คํ† ๋ ˆ์ด์•„์›ƒ์„ ํ•ด์ œํ•ด์ค˜์•ผ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌ๋ฅผ ํ•ด์•ผํ•œ๋‹ค.

@objc private func keyBoardShow(notification: NSNotification) {
    guard let userInfo: NSDictionary = notification.userInfo as? NSDictionary else {
        return
    }
    guard let keyboardFrame = userInfo.value(forKey: UIResponder.keyboardFrameEndUserInfoKey) as? NSValue else {
        return
    }
    let keyboardRectangle = keyboardFrame.cgRectValue
    let keyBoardHeight = keyboardRectangle.height
    detailView.changeTextViewHeight(keyBoardHeight)
}

ํ‚ค๋ณด๋“œ์˜ ๋†’์ด๋Š” Notification ์„ ์ด์šฉํ•˜๋ฉด ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

iOS ๋‚ฎ์€ ๋ฒ„์ „ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ์‹คํ–‰

๐Ÿค”๋ฌธ์ œ ๋‚ฎ์€ ๋ฒ„์ „์˜ iOS ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ๋Œ๋ฆด ์ˆ˜๊ฐ€ ์—†์—ˆ๋‹ค.

๐Ÿ˜†ํ•ด๊ฒฐ ์œ„์ชฝ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ์„ ํƒํ•˜๋Š” ์ฐฝ์—์„œ Download Simulators ๋ฅผ ์„ ํƒํ•˜์—ฌ ๋‚ฎ์€ ๋ฒ„์ „์˜ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์„ค์น˜ํ•˜๋ฉด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๋นŒ๋“œ๋˜๋Š” ๋ฒ„์ „์— ์„ค์ •์— ๋”ฐ๋ผ ์‹คํ–‰์ด ๋˜์ง€ ์•Š์„์ˆ˜๋„ ์žˆ์œผ๋‹ˆ ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค.

STEP2

  • Core Data Fetch ๋ฌธ์ œ
  • ViewModel ํ•˜๋‚˜๋ฅผ ๋‘๊ฐœ์˜ ViewController ๊ฐ€ ๋‚˜๋ˆ ์„œ ์‚ฌ์šฉํ•ด๋„ ๋˜๋Š”๊ฐ€?

Core Data Fetch ๋ฌธ์ œ

๐Ÿค”๋ฌธ์ œ ์„ค๋ช… : CoreData์—์„œ fetch๋กœ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์„ ๋ฐ”๋กœ ์ ‘๊ทผํ• ๋ ค๊ณ ํ• ๋•Œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ.(๋‹ค๋ฅธ ํŒ€๋“ค์—๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋‹ค. ์˜ค๋ฅ˜๋ฌธ๋„ Expected DiaryData but found DiaryData๋กœ ์ด์ƒํ•˜๋‹ค.)

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด as [AnyObjcet]์œผ๋กœ ํ˜•๋ณ€ํ™˜์„ ์‹œ์ผฐ๋‹ค.

๐Ÿ˜†ํ•ด๊ฒฐ

Core Data Fetch ๋ฌธ์ œ ํ•ด๊ฒฐ

์ €์žฅํ• ๋•Œ NSManagedObject ํƒ€์ž…์œผ๋กœ ์ €์žฅ์„ ํ–ˆ์—ˆ๋˜๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋‹ค. ์ €์žฅํ• ๋•Œ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ๋ชจ๋ธ(DiaryData)๋กœ ์ €์žฅํ•ด์•ผ ๋ฌธ์ œ๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ €์žฅํ•˜๋Š” ๋กœ์ง์„ ๋ณ€๊ฒฝํ•˜์—ฟ๋‹ค. ์ดํ›„ ์ฝ์–ด์˜ฌ๋•Œ as [AnyObjcet]๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์•„๋„ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์ง€์•Š์•˜๋‹ค.

guard let diaryData = NSEntityDescription.insertNewObject(
            forEntityName: DiaryInfo.entityName,
            into: context
        ) as? DiaryData else {
            throw CoreDataError.createError
        }

๋‘๊ฐœ์˜ ViewController์™€ ํ•˜๋‚˜์˜ ViewModel

๐Ÿค”๋ฌธ์ œ

MainViewController ์™€ DetailVewController ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ (DiaryCoreData) ๋™์ผํ•˜๋‹ค๊ณ  ์ƒ๊ฐ ๋˜์–ด์„œ TableViewModel ์—์„œ ์ด๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ณ  ์žˆ์—ˆ๋‹ค. ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ViewModel ์„ ๋‚˜๋ˆ  ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€์— ๊ด€ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

1๏ธโƒฃ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•

DelegateํŒจํ„ด์„ ์‚ฌ์šฉํ•ด์„œ DetailViewController๊ฐ€ CoreData๋ฅผ ๋ณ€๊ฒฝํ• ๋•Œ MainViewController๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋” ๊ตฌ์„ฑ์ด๋‹ค. (ViewModel์ด MainViewController์—๋งŒ ์žˆ์œผ๋ฏ€๋กœ)

extension MainViewController: UpdateDelegateable {
    func updatae(diaryInfo: DiaryInfo) {
        do {
            try viewModel.update(data: diaryInfo)
            try viewModel.loadData()
            mainView.reloadData()
        } catch {
            alertMaker.makeErrorAlert(error: error)
        }
    }
    
    func delete(diarInfo: DiaryInfo) {
        do {
            try viewModel.delete(data: diarInfo)
            try viewModel.loadData()
            mainView.reloadData()
        } catch {
            alertMaker.makeErrorAlert(error: error)
        }
    }
}

protocol UpdateDelegateable: UIViewController {
    func updatae(diaryInfo: DiaryInfo)
    func delete(diarInfo: DiaryInfo)
}

final class DetailViewController: UIViewController {
    ...
    weak var delegate: UpdateDelegateable?
    ...
}

DetailViewController ์—์„œ ์ผ์–ด๋‚œ ์‚ฌ๊ฑด์„ MainViewController ๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ตฌ์กฐ๊ฐ€ ์กฐ๊ธˆ์€ ์ด์ƒํ•˜๋‹ค.

2๏ธโƒฃ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ• DetailViewController์˜ TableViewModel ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ฒŒ ํ•˜์—ฌ, MainViewController ์™€ DetailVewController ๋ชจ๋‘ TableViewModel ์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•

final class MainViewController: UIViewController {
    ...
    private var viewModel: TableViewModel<DiaryUseCase>
    ...
}

final class DetailViewController: UIViewController {
    ...
    private var viewModel: TableViewModel<DiaryUseCase>
    ...
}

๐Ÿ˜†ํ•ด๊ฒฐ ๊ฒฐ๊ตญ ๋‹ค๋ฅธ ๋ทฐ๋ชจ๋ธ์„ ๋งŒ๋“ค์–ด์„œ ์ฒ˜๋ฆฌํ•˜์˜€๋‹ค. ์œ ์Šค์ผ€์ด์Šค๋„ ๊ฐ™์ด ๋งŒ๋“ค์–ด์คฌ๋‹ค. ๋ถ„๋ฆฌํ•œ ์ด์œ ๋Š” ๋ทฐ ๋ชจ๋ธ์—์„œ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ทฐ์ปจ์—์„œ์˜ ๋™์ž‘์„ ๋ฐ›๋Š”๋Œ€ ๋‘๊ฐœ์˜ ๋ทฐ์ปจ์ด ์‚ฌ์šฉ๋˜๋ฉด์„œ ํ•˜๋‚˜์˜ ๋ทฐ๋ชจ๋ธ์—์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๊ณค๋ž€ํ•ด์กŒ๋‹ค. ๋˜ํ•œ ๋‘๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ตœ์ ํ™”๊ฐ€ ๋œ ๋˜์žˆ์—ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ๋‹ค๋ฅธ ๋ทฐ๋ชจ๋ธ์„ ๋งŒ๋“ค์–ด์คฌ๋‹ค.

์œ ์‚ฌํ•œ ๋กœ์ง์˜ ํ†ต์ผ, ๋ถ„๋ฆฌ

๐Ÿค”๋ฌธ์ œ delete ๋ฒ„ํŠผ share ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„๋•Œ ๋™์ž‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ mainViewController ์™€ DetailViewController ์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”๋ฐ, ๋‘ ๋กœ์ง์ด ์œ ์‚ฌํ•˜์ง€๋งŒ ์„ธ์„ธํ•œ ๋ถ€๋ถ„์ด ๋‹ค๋ฅด๋‹ค.

data ๋ฅผ ์‚ญ์ œํ•˜๊ณ , ๊ณต์œ ํ•˜๋Š” handler ๋ฅผ MainViewController ์™€ DetailViewController ์—์„œ ๋ชจ๋‘ ์‚ฌ์šฉ์žˆ๋‹ค.

๊ฐ™์€ ๋กœ์ง์ด์ง€๋งŒ ์ฐจ์ด๋Š” ์–ด๋–ค controller ์—์„œ TableViewModel ์— ์ ‘๊ทผํ•˜๋Š๋ƒ ์ด๋‹ค. ์ด ๋‘ ๋กœ์ง์ด ๊ฒน์น˜๋Š” ๋ถ€๋ถ„์ด ๋งŽ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š”๋ฐ ๊ฐ™์€ ํด๋กœ์ €๋ฅผ ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜๋‹ค.

๐Ÿ˜†ํ•ด๊ฒฐ ๊ฒฐ๊ตญ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ผ ๊ทธ๋ƒฅ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ด์คฌ๋‹ค.

SceneDelegate, AppDelegate ํ™œ์šฉ

๐Ÿค”๋ฌธ์ œ ์–ดํ”Œ์ด ํ™ˆํ™”๋ฉด์œผ๋กœ ์ „ํ™˜ํ• ๋•Œ DetailView ํ™”๋ฉด์˜ data ๋ฅผ ์ž๋™ ์ €์žฅ ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด SceneDelegate ์— ์žˆ๋Š” ํ™ˆํ™”๋ฉด์œผ๋กœ ์ „ํ™˜๋  ๋•Œ ๋ถˆ๋ฆฌ๋Š” sceneDidEnterBackground ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ–ˆ๋‹ค.

1๏ธโƒฃ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•

AppDelegate ์—์„œ delegate ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  SceneDelegate์—์„œ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. (AppDelegate๋Š” ์ „์—ญ์ ์œผ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•จ์œผ๋กœ). ์ด ๋ฐฉ๋ฒ•์€ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ์‚ฌํ•ญ์ด ๋งŽ๊ณ , AppDelegate๊ฐ€ delegate ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

2๏ธโƒฃ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ• ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ SceneDelegate์—์„œ ๋ทฐ๋ฅผ ํ™•์ธํ•ด์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

func sceneDidEnterBackground(_ scene: UIScene) {
((self.window?.rootViewController as? UINavigationController)?.topViewController as? DetailViewController)?.saveData()
}

๐Ÿ˜†ํ•ด๊ฒฐ ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜์—ฌ ์ž‘์„ฑํ•˜์˜€๋‹ค. ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ๊ฒฐ๊ตญ TopView๋ฅผ ๊ฐ€์ ธ์™€์•ผ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ TopView๋ฅผ ์ œ๋Œ€๋กœ ๊ฐ€์ ธ์˜ฌ๋ ค๋ฉด ๋ถ„๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๊ผผ๊ผผํ•œ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€์•Š๊ณ  ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

STEP3

  • Rx ์—†์ด MVVM ๊ตฌ์กฐ
  • Result ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝ
  • UseCase

Rx ์—†์ด MVVM ๊ตฌ์กฐ

๐Ÿค”๋ฌธ์ œ ์ฒ˜์Œ์—๋Š” MVVM ํŒจํ„ด์— ์ต์ˆ™ํ•˜์ง€ ์•Š์•„์„œ MVC ์ฒ˜๋Ÿผ MVVM ๊ตฌ์กฐ๋ฅผ ViewController ๊ฐ€ ViewModel ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง์ ‘ ์ ‘๊ทผํ•ด์„œ ํ˜ธ์ถœํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ž‘์„ฑํ•˜์˜€๋‹ค. (ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ฐ›์•„์„œ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ViewController ์—์„œ ํ˜ธ์ถœํ•˜๋„๋ก ์ˆ˜์ •ํ•˜์˜€๋‹ค.)

๐Ÿ˜†ํ•ด๊ฒฐ delegate๋กœ Handler ๋“ค์„ ์ž‘์„ฑํ•ด ์ฃผ์–ด์„œ Handler ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฃผ์ฒด๊ฐ€ ViewController ๊ฐ€ ์•„๋‹Œ ViewModel ์ด ๋˜๊ฒŒ ํ•˜์˜€๋‹ค.

MVVM ์„ ์“ฐ๋ฉด์„œ...

ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ฐธ๊ณ 

๊ณ„์ธต ๋ณ„๋กœ ๊ธฐ๋Šฅ์„ ๋‚˜๋ˆ„๊ณ  ์ถ”ํ›„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ• ๋•Œ ์–ด๋–ค ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑํ•ด์•ผ๋ ์ง€ ๋งŽ์€ ๋„์›€์ด ๋œ๊ฑฐ๊ฐ™๋‹ค. ์šฐ๋ฆฌ MVVM ๊ตฌ์กฐ์—์„œ ์ •ํ•œ ๊ทœ์น™์ด ์žˆ๋‹ค.

  1. ๋ทฐ๋ชจ๋ธ์—์„  ๋ทฐ์™€ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋ฅผ ์“ฐ์ง€์•Š๋Š”๋‹ค.(UIKit ์„ ์ž„ํฌํŠธํ•˜์ง€์•Š๋Š”๋‹ค.)
  2. ๋ทฐ๋ชจ๋ธ์— ์ ‘๊ทผํ• ๋• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •ํ•ด์„œ ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๊ฒŒํ•œ๋‹ค.
  3. ๋ทฐ - ๋ทฐ๋ชจ๋ธ - ์œ ์Šค์ผ€์ด์Šค ์˜ ์—ญํ• ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ถ„๋ฆฌํ•œ๋‹ค.

Result ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝ

๐Ÿค”๋ฌธ์ œ CRUD ๋ฉ”์„œ๋“œ๋ฅผ throws ๋กœ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ ๋ฆฌ๋ทฐ์–ด๊ป˜์„œ try catch ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ˆ˜์ •ํ•ด ๋ณด๋Š” ๊ฒƒ์ด ์–ด๋–ป๊ฒ ๋Š๋ƒ ์ด์•ผ๊ธฐ ํ•ด์ฃผ์…จ๋‹ค.

๐Ÿ˜†ํ•ด๊ฒฐ Result ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด์„œ Success ์™€ Failure ํ•œ ๊ฐ์ฒด๋ฅผ ๋ฐ›๋„๋ก ์„ค์ •ํ–ˆ๋‹ค.

โœ๏ธ ํ•™์Šต๋‚ด์šฉ

  • CoreData
  • KeyBoard
  • ActionSheet
  • ActivityVeiw
  • TableView Cell ์‚ญ์ œ, ์ถ”๊ฐ€
  • TableView Swipe

About

๐Ÿป iOS ์ปค๋ฆฌ์–ด ์Šคํƒ€ํ„ฐ ์บ ํ”„ ๐Ÿ“” ๋‹ค์ด์–ด๋ฆฌ


Languages

Language:Swift 100.0%