๐ŸŽ iOS/๐Ÿ”ฅ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

[iOS] CoreData์—์„œ ํŠน์ • Entity ๋‚ด๋ถ€์— ์žˆ๋Š” Entity์˜ ํŠน์ •๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์„ ๋•Œ(NSPredicate)

MINT09 2023. 12. 20. 23:20

์ฝ”์–ด๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์—ฐ์Šตํ•˜๋‹ค๊ฐ€ ์ƒ๊ธด ์ผ์ด๋‹ค. ๋จผ์ € entity๋กœ๋Š” UserMO์™€ JokeMO ๋‘๊ฐœ๊ฐ€ ์žˆ๋‹ค.

User์™€ Joke๋Š” Model๋„ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด User๋Š” Joke ๋ฐฐ์—ด์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋•Œ๋ฌธ์— ํŠน์ •ํ•œ User์˜ ํŠน์ • ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๊ฐ–๋Š” Joke๋งŒ ์„ ๋ณ„ํ•˜๊ณ  ์‹ถ์€ ๊ณผ์ •์—์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

func fetchWithPredicate(currentUser: User, currentCategory: Category) -> [Joke] {
    var jokes = [Joke]()
    let fetchRequest: NSFetchRequest<UserMO> = UserMO.fetchRequest()
    let idPredicate = NSPredicate(format: "id = %@", currentUser.id as CVarArg)
    fetchRequest.predicate = idPredicate
        
    if let result = try? appDelegate.container.viewContext.fetch(fetchRequest) {
        let jokesData = object.jokes as! Set<JokeMO>
        result.forEach { jokeData in
            let data = Joke(id: jokeData.id!, content: jokeData.content!, category: Category(rawValue: Int(jokeData.category))!)
            jokes.append(data)
            if data.category == currentCategory {
                jokes.append(data)
            }
        }
    }
        
    return jokes
}

์ฒ˜์Œ์—๋Š” ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค. ์ผ๋‹จ NSPredicate๋ฅผ ์‚ฌ์šฉํ•ด user์˜ id๋กœ ํŠน์ •ํ•œ userMO๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๊ทธ๋ ‡๊ฒŒ ๊ฐ€์ ธ์˜จ userMO๋ฅผ fetchํ•ด์„œ user์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ๊ทธ ํ›„ ์•ˆ์˜ ๋‚ด์šฉ์€ ๋ชจ๋‘ fetch ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ๋‹ˆ NSSet๋กœ ๊ฐ€์ ธ์™€์ง„ jokes ๋ฐ์ดํ„ฐ๋ฅผ ํƒ€์ž…์บ์ŠคํŒ…ํ•˜๊ณ  ๊ทธ ์•ˆ์—์„œ currentCategory์™€ ๋งž๋Š” Joke๋งŒ ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•ด์„œ return ํ•œ๋‹ค.

๊ทผ๋ฐ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ผ๋‹จ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€์„œ if๋ฌธ์œผ๋กœ ๊ฑธ๋Ÿฌ์ฃผ๊ธฐ์— ๊ตณ์ด ์•Œ ํ•„์š” ์—†๋Š” ๋ฐ์ดํ„ฐ๊นŒ์ง€ ์ „๋ถ€ ๊ฐ€์ ธ์˜จ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฐพ์€ ๋ฐฉ๋ฒ•์ด ์ด๊ฒƒ์ด๋‹ค.

func fetchWithPredicate(currentUser: User, currentCategory: Category) -> [Joke] {
    var jokes = [Joke]()
    let fetchRequest: NSFetchRequest<JokeMO> = JokeMO.fetchRequest()
    let idPredicate = NSPredicate(format: "user.id = %@ AND category = %x", currentUser.id as CVarArg, Int16(currentCategory.rawValue))
    fetchRequest.predicate = idPredicate
        
    if let result = try? appDelegate.container.viewContext.fetch(fetchRequest) {
        result.forEach { jokeData in
            let data = Joke(id: jokeData.id!, content: jokeData.content!, category: Category(rawValue: Int(jokeData.category))!)
            jokes.append(data)
        }
    }
        
    return jokes
}

relation์„ ํ†ตํ•ด Joke์—ญ์‹œ User์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋ณธ์ธ์„ ๋“ค๊ณ  ์žˆ๋Š” User์— ๋Œ€ํ•ด์„œ! ๊ทธ๋ž˜์„œ ์ฒ˜์Œ๋ถ€ํ„ฐ JokeMO์—์„œ NSPredicate๋กœ ๊ฑฐ๋ฆ„๋ง์ฒ˜๋Ÿผ ์กฐ๊ฑด์„ ์ฃผ์—ˆ๋‹ค. user.id๋ฅผ ํ†ตํ•ด User์˜ id๋กœ ๊ฑฐ๋ฅด๊ณ , ๊ทธ ์•ˆ์—์„œ category๋กœ ๊ฑฐ๋ฅธ๋‹ค. ๊ทธ ํ›„ fetchํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ์šด Jokeํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•ด ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋!

์ฝ”์–ด๋ฐ์ดํ„ฐ์˜ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ ๋” ํŒŒ๋ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค. predicate๋ฅผ ์ž˜ ์“ฐ๋ฉด ์•„์ฃผ ์ ์€ ๋น„์šฉ์œผ๋กœ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค!

๋Œ“๊ธ€์ˆ˜0