2017-02-22 2 views
1

Название объясняет точную проблему. Основной шаблон основной детали CoreData работает только на iOS 10 и выше. Но если вы попытаетесь запустить тот же шаблон на iOS 9 или ниже, он потерпит крах, потому что persistentContainer не был создан, который мы использовали для получения NSManagedObjectContext. Это связано с последним дополнением iOS 10 с xCode 8. Я видел, что для Swift существует несколько обходных решений, но не для Objective-C. Любое лучшее решение для Objc?Исходный код ядра Core Xcode 8 не поддерживается с iOS 9 и ниже

ответ

1

Вот решение,

Поскольку в прошивке 9 и выше не имеет инфраструктуры persistentContainer, в основном вы должны инициализировать основной стек данных самостоятельно,

Этот метод используется в любом месте вашего класса делегата. Это то, что мы делали до iOS 10 persistentContainer ввод ион.

- (void)initializeCoreData 
{ 

    NSDictionary *options = @{ NSSQLitePragmasOption : @{@"journal_mode" : @"DELETE"}}; 

    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"yourmodelname" withExtension:@"momd"]; 
    NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 
    NSAssert(mom != nil, @"Error initializing Managed Object Model"); 

    NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom]; 
    NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 
    [moc setPersistentStoreCoordinator:psc]; 
    _managedObjectContext = moc; 
    [EFLDatabase sharedDatabaseWithManagedObjectContext:_managedObjectContext]; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSURL *documentsURL = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
    NSLog(@"DOC %@", [documentsURL absoluteString]); 
    NSURL *storeURL = [documentsURL URLByAppendingPathComponent:@"yourmodelname.sqlite"]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) { 
     NSError *error = nil; 
     NSPersistentStoreCoordinator *psc = [[self managedObjectContext] persistentStoreCoordinator]; 
     NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]; 
     NSAssert(store != nil, @"Error initializing PSC: %@\n%@", [error localizedDescription], [error userInfo]); 
    }); 
} 

Теперь поместите ниже фрагмент кода в didFinishLaunchingWithOptions метод, который будет в основном проверяет версию IOS, если ниже 10, а затем выполняет вышеупомянутый метод,

if ([[NSProcessInfo processInfo] operatingSystemVersion].majorVersion < 10) { 
     [self initializeCoreData]; 
} 
0

Скачать Xcode 7, создать проект из шаблона и проверить использование основных данных и скопировать стек основные данные из App делегат

+0

Спасибо за ответ. Я уже пробовал, но, к сожалению, это не сработало для меня. –

+0

Когда вы говорите: «это не сработало для меня», в чем же проблема? –

+0

Ну, он не вызвал метод «managedObjectContext» автоматически, чтобы продолжить создание контекста. –

Смежные вопросы