[iOS] CoreData์์ ํน์ Entity ๋ด๋ถ์ ์๋ Entity์ ํน์ ๊ฐ์ ๊ฐ์ ธ์ค๊ณ ์ถ์ ๋(NSPredicate)

์ฝ์ด๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฐ์ตํ๋ค๊ฐ ์๊ธด ์ผ์ด๋ค. ๋จผ์ 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๋ฅผ ์ ์ฐ๋ฉด ์์ฃผ ์ ์ ๋น์ฉ์ผ๋ก ์ํ๋ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ฌ ์ ์๋ค!