티스토리 뷰

Swift&IOS

다시 써보는 CoreData

밀쿄 2019. 10. 2. 18:01

안녕하세여 

제가 과거에 CoreData에 대한 글을 쓴 적 있어요, ( https://milyo-codingstories.tistory.com/2 )

조금 더 보안하고자 다시 글을 잡습니다..

4월달의 저니까..완전 초짜일때 적은거네요

지금도 초짜지만 저때는 더 초짜였던..

자그럼 바로 시작하겠습니다

https://developer.apple.com/documentation/coredata/setting_up_a_core_data_stack?changes=_7

 

Setting Up a Core Data Stack | Apple Developer Documentation

Article Setting Up a Core Data Stack Set up the classes that manage and persist your app’s objects. OverviewAfter you create a data model file as described in Creating a Core Data Model, set up the classes that collaboratively support your app’s model laye

developer.apple.com

 

cmd + N 을 누르고

적당한 Data Mdoel을 만들어 줍니다.

 

그러고 나서 적당한 엔티티를 넣어줍니다.

 

이제부터 CoreDataStack을 직접 만들예정입니다.

 

전 싱글톤으로 만들었는데

선택의 여러분의 몫이라 생각합니다

이렇게 만들어주고 시작하겠습니다

 

먼저 만들 놈은... NSManagedObjectModel 입니다

 

NSManagedObjectModel은

앱의 유형, 속성 및 관계를 설명하는 앱의 모델 파일 입니다.

이렇게 초기화해서 사용합니다.

forResource에는 DataModel의 파일명이 들어갑니다.

( xcdatamodeld 확장자를 가진 그 파일 입니다. )

momd는 xcdatamodeld 컴파일되면 저런 확장저가 된다네요

 

그 다음에 살펴볼 파일은 NSPersistentStoreCoordinator 입니다

이거에 대한 설명으 저 위에 과거에 제가 쓴 글을 참고해주세요.

ofType에는 종류가 4가지 정도 있습니다

이 정도 타입이 있습니다

주의하실껀 InMemory타입은 앱이 종료되면 사라집니다.

보통 캐시용도로 많이 사용한다고 알고 있습니다.

 

그 다음 만들어야하는건

NSManagedObjectContext 입니다.

사실 코어데이터에서 얘를 작업단위로 생각하시면 편합니다.

context.save...context.perform...등등

특히 얘는 변경사항을 추적하는 ? 그런 역할도 있습니다.

이렇게 만들어주면 됩니다.

지금 만든 context는 메인큐 이므로

나중에 저장하거나 fetch할 때는 새로 하나 만들어서 하는 게 좋습니다.

안그러면 전부 메인에서 돌껀데...음..좋진 않겠죠?

그래서 automaticallyMergesChangesFromParent를 넣어줍니다.

 

managedObjectcontext는 엥 이 놈은 부모가 없는데? 하실 수 있는데

( 음..어...부모가 없다니 어감이 좀 그렇네요 )

부모를 지정해주지 않았지만 이 경우엔

CoreDataExample.sqlite가 부모입니다.

 

쉽게 생각하면 다른 context를 생성해서

context에서  새 데이터를 생성해서

저장하면 저장이 되겠죠? 

그럼 부모(CoreDataExample.sqlite)가 바뀌니까

나(managedObjectcontext)한테  자동으로 합쳐줘 그런 기능을 하는겁니다.

( 더 쉽게 생각하면 context마다 자기만의 세계를 가지고 있다고 생각하면 됩니다. )

( AContext, BContext가 있다고 치면 두 context는 부모는 같지만 서로 다른 세계에 삽니다 )

( BContex가 사는 세계에선 새데이터가 생성되어 부모에게 저장했습니다 )

( 그럼 AContext가 사는 세계도 부모에 따라바뀌어야하니까'

여러가지 방법 중 automaticallyMergesChangesFromParent를 사용한거죠 )

( 부모가 바뀌으면 나한테 머지해줘 )

 

자 이제 실제 코드에 적용해보겠습니다,

오늘도 뷰가 먼저 나오겠습니다.

+ 버튼을 누르면 셀 아이템이 추가되고

왼쪽에 리로드 버튼 누르면 테이블뷰가 리로드 되게 하겠습니다

 

그럼 fetch하는 코드부터 가지고 오겠습니다.

여기서 주의할 점은

저 excute는 NSManagedObjectContext가 필요합니다

근데 인자로 따로 받지도 않아서 그냥 실행하면 fetch 안되실꺼니

저렇게 perform해주시면 됩니다.

 

그리고 저기 저 Movie는 아까 우리가 코어데이터에서 생성한 엔티티입니다.

에러가나면 코드 지우시고 빌드한번 해보시고 

그래도 안뜨면 엑스코드를 꺼다키시면 아마 될껍니다.

( 빌드하면서 자동으로 만들어주는 거든요 )

 

어디까지나 참고로 말씀드리지만

저놈은 이렇게 생겼습니다.

( 직접 안만드셔도 됩니다 )

여기서 Codegen이 Class Definition이므로

만들어주면 에러날껍니다.

( 저 파일이 두개가 되어버리니까. )

직접 만들고 싶으시면..저걸 메뉴얼로 바꾸시고 하시면 됩니다.

 

 

다시 본론으로 돌아와서

이번에는 추가를 만들어봅시다.

 

이렇게 context를 하나 만들어서 이렇게 저장해주시면 됩니다,

여기서는 왜 perform을 하는거죠 라고 물으시면..

우리가 지정한 저 큐 타입을 지켜주기 위해서 그렇습니다.

저걸 아무리 privateQueueConcurrencyType라고 해도..

perform을 안해준 상태인데

저 코드 플로우가 메인에서 실행되는 코드면 의미가 없습니다..

그러므로 perform을 적어주세요.

 

수정은 다음과 같이 하시면 됩니다.

같은 맥락이니 설명은 안하겠습니다.

 

자 다되었습니다.

차근차근 따라하시면 잘될껍니다.

 

참고로 다음 시간엔 

이것보다 훨씬 편한 방법을 포스팅하겠습니다.

 

예제소스 입니다.

https://github.com/dp221125/CoreData_Example

 

dp221125/CoreData_Example

Contribute to dp221125/CoreData_Example development by creating an account on GitHub.

github.com

 

'Swift&IOS' 카테고리의 다른 글

Swift의 메모리 관리 - ARC 001  (0) 2019.10.21
iOS13 바뀐 UIModalPresentationStyle에 관해서..  (0) 2019.10.02
NotificationCenter  (0) 2019.10.01
@discardableResult  (0) 2019.09.24
KVO로 MVVM을 짜본다면?  (0) 2019.09.09
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함