Core Data(Initializing the Core Data Stack)
어플리케이션 데이터에 액세스하기 전에 Core Data의 스택(stack)을 초기화합니다.스택(stack)의 초기화는 Core Data가 데이터에 대한 요청과 생성을 준비했습니다.다음은 Core Data의 스택(stack)을 만드는 방법의 예입니다.
Objective-C
@interface MyDataController : NSObject
@property (strong, nonatomic, readonly) NSPersistentContainer *persistentContainer;
- (id)initWithCompletionBlock:(CallbackBlock)callback;
@end
@implementation MyDataController
- (id)init {
self = [super init];
if (!self) return nil;
self.persistentContainer = [[NSPersistentContainer alloc] initWithName:@"DataModel"];
[self.persistentContainer loadPersistentStoresWithCompletionHandler:^(NSPersistentStoreDescription *description, NSError *error) {
if (error != nil) {
NSLog(@"Failed to load Core Data stack: %@", error);
abort();
}
callback();
}];
return self;
}
SWIFT
import UIKit
import CoreData
class DataController: NSObject {
var managedObjectContext: NSManagedObjectContext
init(completionClosure: @escaping () -> ()) {
persistentContainer = NSPersistentContainer(name: "DataModel")
persistentContainer.loadPersistentStores() { (description, error) in
if let error = error {
fatalError("Failed to load Core Data stack: \(error)")
}
completionClosure()
}
}
}
이 예는 프로그램 영구층의 컨트롤러 대상 (controller object) 을 만들었습니다.이 컨트롤러 (controller) 는 기본적으로 init 초기화 방법입니다. 이 init 방법의 일부로서 Core Data를 초기화하는 방법이 호출되고 Core Data의 창고 (stack) 를 만듭니다.
영구 컨테이너(NSPersistentContainer)
IOS10 및 MacOS10.12부터 NSpersistentContainer는CoreData의 스택(stack) 생성을 처리하고 NSManagedObejctContext의 편리한 방법을 제공합니다.IOS10 및 MacOS 10.12 이전에 Core Data의 스택(stack)을 만드는 것은 더욱 복잡합니다.
Objective-C
- (id)initWithCompletionBlock:(CallbackBlock)callback;
{
self = [super init];
if (!self) return nil;
//This resource is the same name as your xcdatamodeld contained in your project
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Workspace" withExtension:@"momd"];
NSAssert(modelURL, @"Failed to locate momd bundle in application");
// The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.
NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
NSAssert(mom, @"Failed to initialize mom from URL: %@", modelURL);
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[moc setPersistentStoreCoordinator:coordinator];
[self setManagedObjectContext:moc];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
NSPersistentStoreCoordinator *psc = [[self managedObjectContext] persistentStoreCoordinator];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *documentsURL = [[fileManager URLsForDirectory:NSDocumentationDirectory inDomains:NSUserDomainMask] lastObject];
// The directory the application uses to store the Core Data store file. This code uses a file named "DataModel.sqlite" in the application's documents directory.
NSURL *storeURL = [documentsURL URLByAppendingPathComponent:@"DataModel.sqlite"];
NSError *error = nil;
NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];
if (!store) {
NSLog(@"Failed to initalize persistent store: %@
%@", [error localizedDescription], [error userInfo]);
abort();
//A more user facing error message may be appropriate here rather than just a console log and an abort
}
if (!callback) {
//If there is no callback block we can safely return
return;
}
//The callback block is expected to complete the User Interface and therefore should be presented back on the main queue so that the user interface does not need to be concerned with which queue this call is coming from.
dispatch_sync(dispatch_get_main_queue(), ^{
callback();
});
});
return self;
}
Swift
init(completionClosure: @escaping () -> ()) {
//This resource is the same name as your xcdatamodeld contained in your project
guard let modelURL = Bundle.main.url(forResource: "DataModel", withExtension:"momd") else {
fatalError("Error loading model from bundle")
}
// The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.
guard let mom = NSManagedObjectModel(contentsOf: modelURL) else {
fatalError("Error initializing mom from: \(modelURL)")
}
let psc = NSPersistentStoreCoordinator(managedObjectModel: mom)
managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.mainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = psc
let queue = DispatchQueue.global(qos: DispatchQoS.QoSClass.background)
queue.async {
guard let docURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last else {
fatalError("Unable to resolve document directory")
}
let storeURL = docURL.appendingPathComponent("DataModel.sqlite")
do {
try psc.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: storeURL, options: nil)
//The callback block is expected to complete the User Interface and therefore should be presented back on the main queue so that the user interface does not need to be concerned with which queue this call is coming from.
DispatchQueue.main.sync(execute: completionClosure)
} catch {
fatalError("Error migrating store: \(error)")
}
}
}
코어데이터의 스택(stack) 건설을 제외하고 NSPersistentContainer 역시 개발자가 응용 프로그램의 다중 스레드를 사용할 때 편리한 방법을 제공했다.
관리형 객체 모델(NSManagedObjectModel)
NSManagedObjectModel의 실례(실례화)는 Core Data의 스택(stack)이 접근할 데이터를 설명한다.Core Data의 스택(stack)이 생성되는 동안 NSManaged ObjectModel은 스택(stack)이 생성될 때 처음으로 메모리에 생성되어 로드됩니다.위 코드는 알려진 프로그램 주 bundle의 파일 이름인 NSURL을 사용합니다.NSManagedObjectModel이 초기화되면 NSPersistertStroreCoordinator가 생성됩니다.
영구 저장 조정기(NSPersistentStoreCoordinator)
NSPersistentStoreCoordinator는 Core Data의 스택(stack) 가운데 위치입니다.조율기는 모델에 정의된entities를 실례로 실현하는 것을 책임진다.조정기는 모델의 entities를 새로운 실례로 만들고 데이터 영구 저장 (NSPersistentStore) 에서 기존의 실례를 검색합니다.데이터의 지속성은 디스크 (disk) 나 메모리 버스 (memory) 에 오래 저장될 수 있다.애플리케이션 구조에 따라 NSPersistentStore Coordinator를 통해 한 개 이상의 영구화 저장소가 조화를 이룰 수 있습니다. 보기 드물지만.
NSManagedObjectModel이 데이터의 구조를 정의한 것을 감안하여 NSPersistentStoreCoordinator는 영구적으로 저장된 데이터에서 대상을 실현하고 이를 통해 NSManagedObjectContext를 요청한다.이것은 또한 NSPersistentStoreCoordinator의 데이터가 일치하는 정의가 일치하는 NSManagedObjectContext에 있음을 나타낸다.
NSPersistentStore Coordinator를 추가하는 NSPersistentStore를 호출할 때 비동기적으로 수행됩니다.소수의 경우 호출 루트가 막힐 수 있습니다. (예를 들어 iCloud 계승과 이전)따라서 사용자 인터페이스 대기열의 막힘을 피하기 위해 비동기적으로 요청 호출을 실행하는 것이 좋다.
객체 컨텍스트 관리(NSManagedObjectContext)
관리 대상 상하문 (NSManagedObjectContext) 은 응용 프로그램이 자주 연락하는 대상이기 때문에 응용 프로그램에 하나만 노출되어 있습니다. (예를 들어 단일 모드와 같습니다.)NSManagedObjectContext는 스마트 메모와 유사합니다.지구화 데이터에서 대상을 얻을 때, 이 스마트 메모지에 임시 대상 복사본을 만들어서 대상 그림 (object graphs) (또는 대상 그림 (object graphs) 의 집합을 형성합니다.너는 이 대상들을 마음대로 수정할 수 있다. 이 수정 사항을 저장하기 전에, 영구적으로 저장된 데이터는 변하지 않는다.
모든 관리 객체는 관리 객체의 컨텍스트에 등록되어야 합니다.상하문 (context) 을 사용하여 대상을 대상 그림에 추가하거나 대상 그림에서 대상을 설명합니다.상하문 (context) 은 한 대상의 속성 변경이든, 대상 간의 관계 변경이든, 변경 사항을 추적합니다.변경 사항을 추적하면 상하문 (context) 에서 취소와 재작업을 지원할 수 있습니다.그것 또한 대상 간의 관계를 바꿀 때 대상 그림의 완전성을 확보할 수 있다.
변경 사항을 저장하려면 상하문 (context) 에서 이 대상들이 유효한 상태인지 확인하십시오.대상이 유효한 상태여야 변경 사항이 영구화 저장소에 기록되고, 사용자가 만든 대상에 새로운 기록을 추가하며, 삭제한 기록을 삭제할 수 있습니다.
CoreData가 없다면, 압축 파일과 데이터의 지속성을 지원하는 방법, 추적 대상의 모델을 써야 하고, 취소 관리와 취소 방법도 있어야 한다.Core Data의 프레임워크에서 대부분의 기능은 자동에서 제공되며 주로 관리 대상의 상하문(managed object context)을 통해 제공된다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.