Core Data(Initializing the Core Data Stack)

8812 단어
코어 데이터의 스택(stack)은 하나의 프레임워크 대상의 집합으로 코어 데이터의 초기화 부분으로 접근하고 응용 프로그램과 외부 데이터 저장 사이를 조정한다.Core Data는 외부 데이터 저장소와의 상호작용을 처리하여 응용 프로그램이 논리적 처리에 더욱 집중할 수 있도록 합니다.코어 데이터의 스택(stack) 패키지는 주로 관리 대상 상하문(NSManaged OberjctContext), 지속성 저장 조정기(NSPersistentStore Coordinator), 위탁 관리 대상의 모델(NSManaged Object Model), 지속화 용기(NSPerSistent Container) 네 가지 대상을 포함한다.
어플리케이션 데이터에 액세스하기 전에 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)을 통해 제공된다.

좋은 웹페이지 즐겨찾기