Переопределить managedObjectModel в UIManagedDocument - PullRequest
5 голосов
/ 24 октября 2011

Я работаю с новыми функциями UIDocument в iOS 5.0.У меня есть приложение, которое использует несколько различных моделей данных (файлы MOMD).Согласно документации для UIManagedDocument, вы можете переопределить - (NSManagedObjectModel *) managedObjectModel, чтобы загрузить определенную модель данных (по умолчанию загружаются все найденные модели данных, объединенные вместе).Обе модели данных имеют перекрывающиеся имена моделей с разными схемами, поэтому в моем случае это нежелательно.

Соответствующий Apple Doc

Итак, проблема, с которой я столкнулся здесь впростой пример: я могу переопределить функцию, но не могу присвоить ее результат.Он является частным, поэтому подкласс не может получить доступ к _managedObjectModel;и, это только для чтения, поэтому self.managedObjectModel не может быть назначен ..

Я искал пример UIManagedDocument, который переопределяет managedObjectModel, но, похоже, Apple его не предоставляет.

Я могу определить новую переменную экземпляра _myManagedObjectModel и назначить ее.Затем верните это на метод доступа, который я переопределяю.Я обеспокоен тем, что это может нарушить некоторую внутреннюю реализацию UIManagedDocument, который не использует аксессор managedObjectModel в предпочтении для _managedObjectModel (что часто встречается в реализациях Apples ...)

Похоже на прямую проблему, и я подозреваю,Я просто упускаю что-то действительно простое, чтобы разрешить правильное переопределение.

//
//  DTNoteDocument.m
//  document-test
//
//

#import "DTNoteDocument.h"

@implementation DTNoteDocument

NSString * const kDataManagerModelName = @"Note";

-(NSManagedObjectModel*)managedObjectModel {

    if (_managedObjectModel != nil)
        return _managedObjectModel;

    NSBundle *bundle = [NSBundle mainBundle];
    NSString *modelPath = [bundle pathForResource:kDataManagerModelName ofType:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]]; // compile error on this line, private variable cannot be assigned

    return _managedObjectModel;
}
@end

Заголовок:

#import <UIKit/UIKit.h>

@interface DTNoteDocument : UIManagedDocument

@end

Ответы [ 2 ]

5 голосов
/ 01 ноября 2011

Я решил эту проблему на прошлой неделе, но решил обновить, чтобы отразить мое решение. Если вы найдете что-то лучшее, я был бы рад это увидеть.

Я добавил уникальное свойство в заголовок своего класса для стартов:

@property (nonatomic,retain,readonly) NSManagedObjectModel *myManagedObjectModel;

Затем добавил следующее в мою реализацию класса:

-(NSManagedObjectModel*)myManagedObjectModel {
    if (myManagedObjectModel)
        return myManagedObjectModel;

    NSBundle *bundle = [NSBundle mainBundle];
    NSString *modelPath = [bundle pathForResource:kDataManagerModelName ofType:@"momd"];
    myManagedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]];

    return myManagedObjectModel;
}

-(NSManagedObjectModel*)managedObjectModel {
    return self.myManagedObjectModel;
}

Так как я могу переопределить свойство get для managedObjectModel, это работает довольно хорошо. UIManagedDocument до сих пор инициализируется и отлично работает в моих тестах и ​​реализациях. Выполнение трассировки показывает, что managedObjectModel вызывается при инициализации, поэтому я предполагаю, что все возвращено правильно из возвращенного результата.

0 голосов
/ 25 мая 2012

Наконец-то я узнал о проблеме, связанной с вашим решением. UIManagedDocument должен позволять нам изменять параметры objectmodelLoading ...

Вы пропустили в своем коде это:

.m файл

#import <CoreData/CoreData.h>

@implementation DTNoteDocument{
    NSManagedObjectModel * myManagedObjectModel;
}
...