Notice
Recent Posts
Recent Comments
Link
ยซ   2024/07   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

lgvv98

ch10 ํ˜„์ƒ๊ธˆ ๋žญํ‚น์•ฑ ์ฝ”๋“œ๋ฆฌ๋ทฐ(MVVM) ๋ณธ๋ฌธ

โš ๏ธ deprecated โš ๏ธ/ํŒจ์บ (์˜ฌ์ธ์›)

ch10 ํ˜„์ƒ๊ธˆ ๋žญํ‚น์•ฑ ์ฝ”๋“œ๋ฆฌ๋ทฐ(MVVM)

๐Ÿฅ• ์บ๋Ÿฟ๋งจ 2021. 6. 21. 22:37

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ๊ฐ•์˜๋Š” ์งง์•˜์ง€๋งŒ, ๊ณต๋ถ€ํ•  ๋‚ด์šฉ์€ ์™•์ฐฝ์ธ ์‹œ๊ฐ„์ด์—ˆ๋‹ค...

 

(๋ชฉ์ฐจ)

 - MVVM Review

 - Model ์‹ค์ „ ์„ค๋ช…

 - ViewModel ์‹ค์ „ ์„ค๋ช…

 - View ์‹ค์ „ ์„ค๋ช…

 - ๊ตฌ์กฐ์ฒด ๋ฐฐ์—ด์„ ์ •๋ ฌํ•˜๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌ

 

โœ… MVVM Review

 - Model : ๋ฐ์ดํ„ฐ(struct)

 - View : UI์š”์†Œ(UIView, UIViewController)

 - ViewModel : ์ค‘๊ณ„์ž(ViewModel) -> ๋ทฐ์™€ ๋ชจ๋ธ์ด ์ง์ ‘ ์†Œํ†ตํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ViewModel์„ ํ†ตํ•ด ๊ฐ„์ ‘ ์†Œํ†ตํ•ด์•ผ ํ•œ๋‹ค.

 

๐Ÿ’ก์ด๋ก ์— ๋Œ€ํ•ด ๋” ๊ตฌ์ฒด์ ์ธ ์‚ฌํ•ญ์ด ๊ถ๊ธˆํ•˜๋‹ค๋ฉด...

2021.06.21 - [iOS/ํŒจ์บ ๊ณต๋ถ€] - MVVM ํŒจํ„ด

 

MVVM ํŒจํ„ด

๋””์ž์ธ ํŒจํ„ด ๊ธฐ์ดˆ #1 ํด๋ฆฐ ์•„ํ‚คํ…์ณ ๐Ÿš€ ๋””์ž์ธ ํŒจํ„ด ๐Ÿš€ ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ!! Goal 1. ๊ธฐ์ˆ ๋ถ€์ฑ„ ์ตœ์†Œํ™” ๐Ÿ’ธ 2. ์žฌ์‚ฌ์šฉ ๋ฐ ์ง€์† ๊ฐ€๋Šฅ โ™ป๏ธ ๋””์ž์ธ ํŒจํ„ด ๊ธฐ์ดˆ #2 MVC(Model - View - Controller) Model : ๋ฐ์ดํ„ฐ(Struct) V..

rldd.tistory.com

 

 

โœ… ์ž ๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ์ด๋ก ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ฝ”๋“œ์—์„œ MVVM ํŒจํ„ด์„ ์ ์šฉํ•ด๋ณด๋ฉด์„œ ์‹ค์ „์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ  ๋‚˜๋งŒ์˜ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ฆฌํ•ด๋ณด๋„๋ก ํ•˜์ž

 

1๏ธโƒฃ  Model์€ ๋ฐ์ดํ„ฐ(struct)๋ผ๊ณ  ํ–ˆ์ง€? ๋ง๊ทธ๋ž˜๋„ struct๋‹ค. 

struct BountyInfo {
    let name : String
    let bounty : Int
    
    var image : UIImage? {
        return UIImage(named: "\(name).jpg")
    }
    
    init(name : String, bounty: Int) {
        self.name = name
        self.bounty = bounty
    }
}

๋‚ด ์ฝ”๋“œ์—์„œ ์ž‘์„ฑ๋œ  Model์ธ๋ฐ, struct๋กœ BountyInfo๋ฅผ ๊ตฌ์„ฑํ•˜์˜€๋‹ค.

Model์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ณ , ๋งŒ์•ฝ ์„œ๋ฒ„๊ฐ€ ์žˆ๋‹ค๋ฉด ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜ฌ ๋ฐ์ดํ„ฐ์˜ ๋ณ€์ˆ˜๋“ค์„ ๋ชจ์•„๋‘” ์˜ค๋ธŒ์ ํŠธ ๊ฐ™์€ ๋Š๋‚Œ์ด๋‹ค. 

Model์—๋Š” ์„ ์–ธ๊ณผ init๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ฆ‰, ๋ฐ์ดํ„ฐ๋ฅผ ์บก์Šํ™” ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด!! 

 

 

2๏ธโƒฃ  ๋‹ค์Œ์€ ViewModel์ธ๋ฐ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ์ดํ•ด๋ฅผ ๋„์™€๋ณด์ž

class BountyViewModel {
    let bountyInfoList : [BountyInfo] = [
        BountyInfo(name: "brook", bounty: 33000000),
        BountyInfo(name: "chopper", bounty: 50),
        BountyInfo(name: "franky", bounty: 44000000),
        BountyInfo(name: "luffy", bounty: 300000000),
        BountyInfo(name: "nami", bounty: 16000000),
        BountyInfo(name: "robin", bounty: 80000000),
        BountyInfo(name: "sanji", bounty: 77000000),
        BountyInfo(name: "zoro", bounty: 120000000)
    ]
    
    var sortedList : [BountyInfo] {
        let sortedList = bountyInfoList.sorted { prev, next  in
            return prev.bounty > next.bounty
        }
        
        return sortedList
    }
    
    var numOfBountyInfoList : Int {
        return bountyInfoList.count
    }
    
    func bountyInfo(at index : Int) -> BountyInfo {
        return sortedList[index]
    }
    
}

ViewModel ์—์„œ๋Š” Model์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜๋Š” ์ž‘์—…์„ ์—ฌ๊ธฐ์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์กฐ๊ธˆ ํŠน์ดํ•œ ์ ์€ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ return์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ,  ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ฐธ์กฐํ•  ๋•Œ, ๋ฐ์ดํ„ฐ ๊ฐ’์„ return ํ•ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ!

 

3๏ธโƒฃ  ๋งˆ์ง€๋ง‰์€ View

๋ทฐ๋Š” ์ฝ”๋“œ๋ฅผ ๋”ฐ๋กœ ์ฒจ๊ฐ€ํ•˜์—ฌ ์„ค๋ช…ํ•˜์ง€๋Š” ์•Š๊ฒ ๋Š”๋ฐ, View์—๋Š” UI๊ตฌ์„ฑ๊ณผ ๊ด€๋ จํ•œ ์ฝ”๋“œ๋‚˜ ํ‰์†Œ์— ์ž‘์„ฑํ•˜๋˜๋Œ€๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋ผ.

โ—๏ธ์ฃผ์˜ํ•  ์ ์€ ๋ณ€์ˆ˜๋ฅผ Model์—์„œ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ๊ณผ ์ฐธ์กฐํ•  ๋•Œ์—๋Š” ViewModel์„ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•ด์•ผํ•œ๋‹ค๋Š” ์ ์ด์•ผ.

 

4๏ธโƒฃ  ๊ตฌ์กฐ์ฒด ๋ฐฐ์—ด์„ ์ •๋ ฌํ•˜๋Š” ์ฝ”๋“œ

let bountyInfoList : [BountyInfo] = [
        BountyInfo(name: "brook", bounty: 33000000),
        BountyInfo(name: "chopper", bounty: 50),
        BountyInfo(name: "franky", bounty: 44000000),
        BountyInfo(name: "luffy", bounty: 300000000),
        BountyInfo(name: "nami", bounty: 16000000),
        BountyInfo(name: "robin", bounty: 80000000),
        BountyInfo(name: "sanji", bounty: 77000000),
        BountyInfo(name: "zoro", bounty: 120000000)
    ] //C์—์„œ ๊ตฌ์กฐ์ฒด ๋ฐฐ์—ด๊ณผ ํ˜•์‹์ด ๋น„์Šทํ•ด์„œ ๊ตฌ์กฐ์ฒด ๋ฐฐ์—ด์ด๋ผ๊ณ  ์ด๋ฆ„ ๋ถ™์ž„ 
    // ๊ตฌ์กฐ์ฒด ๋ฐฐ์—ด์„ ์„ ์–ธ
    
    var sortedList : [BountyInfo] {
        let sortedList = bountyInfoList.sorted { prev, next  in
            return prev.bounty > next.bounty
        } // ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ (ํฐ์ˆ˜์—์„œ -> ์ž‘์€์ˆ˜๋กœ)
        
        return sortedList // ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ฐธ์กฐํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—!
    } // ๊ตฌ์กฐ์ฒด ๋ฐฐ์—ด์ธ๋ฐ ์ •๋ ฌ๋œ ๋ณ€์ˆ˜
    // ์„ ์–ธ๋œ ๊ตฌ์กฐ์ฒด ๋ฐฐ์—ด์„ ๊ฐ–๊ณ  ์ •๋ ฌ

์ด๋Ÿฐ ์ฝ”๋“œ๋Š” ์ฒ˜์Œ๋ด์„œ ์ƒ๊ฐํ•˜๋Š”๋ฐ ๋„์›€์ด ๋งŽ์ด ๋˜์—ˆ๋”ฐ. ์šฐ์„  bounty๊ฐ’์„ ๊ฐ–๊ณ  ์ •๋ ฌํ•œ ๊ฒƒ์ด ์ƒ๋‹นํžˆ ์‹ ์„ ํ–ˆ๋‹ค!!

 

 

Comments