자체 Core Data Stack 작성
한 항목의 최신 실현을 위해 시간이 있으면 잘 수정해 주십시오.
protocol UsesCoreDataObjects: class {
var managedObjectContext: NSManagedObjectContext? { get set }
}
class CoreDataStack {
private let modelName: String
init(modelName: String) {
self.modelName = modelName
}
lazy var managedContext: NSManagedObjectContext = self.storeContainer.viewContext
var savingContext: NSManagedObjectContext {
return storeContainer.newBackgroundContext()
}
private lazy var storeContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: self.modelName)
//persistentStoreDescriptions ,
container.loadPersistentStores { (storeDescription, error) in
if let error = error as NSError? {
print("Unresolved error \(error), \(error.userInfo)")
}
}
return container
}()
func saveContext () {
guard managedContext.hasChanges else { return }
do {
try managedContext.save()
} catch let error as NSError {
print("Unresolved error \(error), \(error.userInfo)")
}
}
}
분할선 이상은 2017년 05월 16일 17:21:23에 추가된 것으로 다음은 낡은 내용입니다.
간단한CoreDataStack은 사용되는 네 가지 흔히 볼 수 있는 기본적인 종류를 봉인하는 것이다.
NSManagedObjectModel
,NSPersistentStore
,NSPersistentStoreCoordinator
와NSManagedObjectContext
.생성:
CoreDataStack.swift
첫 번째 섹션에서 Model 이름과 Document의 경로 URL 만들기: 새 파일 만들기.swift
import CoreData
class CoreDataStack {
let modelName = "BALABALA"
//Document's URL
private lazy var applciationDocumentDirectory: NSURL = {
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
return urls[urls.count-1]
}()
}
두 번째 단계는 클래스에 게으름 로드의 세 가지 속성
NSManagedObjectContext
,NSPersistentStoreCoordinator
과NSManagedObjectModel
를 추가합니다. //NSManagedObjectContext
//Note: ConcurrencyType , .MainQueueConcurrencyType
// Context , Context PersistentStoreCoordinator
lazy var context: NSManagedObjectContext = {
var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = self.psc
return managedObjectContext
}()
//NSPersistentStoreCoordinator
// StoreCoordinator ,StoreCoordinator PersistentStore(s) ObejctModel , PersistentStore。
private lazy var psc: NSPersistentStoreCoordinator = {
//coordinator init, Model,Model Entity relationship
let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
// PersisitentStore
let url = self.applciationDocumentDirectory.URLByAppendingPathComponent(self.modelName)
do{
// Option :
let options = [NSMigratePersistentStoresAutomaticallyOption : true]
//addPersistentStoreWithType SQLite type, SQLite 。
try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL:url, options: options)
} catch {
print("Error adding persistnet store.")
}
return coordinator
}()
//NSManagedObjectModel
// MainBundle momb `.xcdatamodeld` , Xcode Entity Relationship , ManagedObjectModel
private lazy var managedObjectModel: NSManagedObjectModel = {
let modelURL = NSBundle.mainBundle().URLForResource(self.modelName, withExtension: "momd")!
return NSManagedObjectModel(contentsOfURL: modelURL)!
}()
추가된 모든 Property는 Core Data의 중요한 구성 요소에 대응하고
Lazy Loading
사용하며, 모든 구성 요소는 다른 구성 요소에 의존합니다.이러한 Property 중
NSManagedObjectContext
만 Public의 Property이고 나머지는private 수식이다.private 수식된 구성 요소는 외부에서 가져올 필요가 없습니다.또한
NSPersistentStoreCoordinator
는 NSManagedObjectContext
의Publicproperty를 통해 얻을 수 있습니다.모든
NSManagedObjectModel
과NSPersistentStore
는 NSPersistentStoreCoordinator
의Publicproperty를 통해 얻을 수 있다.StoreCoordinator
에 게으름을 피우면 개과PersistentStore(s)
와ObejctModel
사이에 있기 때문에 적어도 하나PersistentStore
가 필요합니다.마지막으로 다음 메서드를 추가합니다.
//
func saveContent () {
if context.hasChanges {
do {
try context.save()
} catch let error as NSError {
print("Error: \(error.localizedDescription)")
abort()
}
}
}
AppDelegate
에 LazyLoading 의 iVar 추가:lazy var coreDataStack = CoreDataStack()
didFinishLaunchingWIthOption
방법에서 루트 ViewController의 Context에 값을 지정할 수 있습니다.let navigationController = window!.rootViewController as! UINavigationController
let viewController = navigationController.topViewController as! ViewController
viewController.managedContext = coreDataStack.context
다음은 적당한 시기에
SaveContent
방법을 호출한다. 여기는 applicationDidEnterBackground
와 applicationWillTerminate
에이전트 방법에서 호출한다.coreDataStack.saveContent()
여기에서 CoreData의 창고 클래스가 생성되었고, 응용 프로그램이 종료될 때 Context에 대한 saveContent 작업이 이루어졌습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.