Coredata - массив извлеченных объектов, пустой при вызове из другого класса - PullRequest
1 голос
/ 03 января 2012

Из - viewDidLoad () класса UIViewController (называемого StageDetailViewController) я вызываю метод экземпляра для другого класса (называемого ContentController).

 - (void)viewDidLoad {
        [super viewDidLoad];
        ContentController * instance = nil;
        instance = [[ContentController alloc] init];
        [instance fetchSectorList];
        [instance release];

       ....other stuff ....

}

Вызываемый метод (fetchSectorList) выглядит следующим образом:

- (void)fetchSectorList {

     NSLog(@"fetchSectorList method called");

     NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:@"Sectors" inManagedObjectContext:self.managedObjectContext];
     [fetchRequest setEntity:entity];
      NSError *error;
      NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

      for (NSManagedObject *info in fetchedObjects) {
           NSLog(@"aircraft in fetchsectorlist: %@", [info valueForKey:@"aircraft"]);
      }

[fetchRequest release]; 

}

Метод имеет тип void просто потому, что на этом этапе все, что я хочу сделать, - это вызвать его и убедиться, что у него есть какое-то допустимое содержимое.

Вот проблема: Когда я вызываю (void) fetchSectorList из StageDetailViewController, файл NSLog подтверждает, что он был вызван:

"Метод fetchSectorList называется"

... но цикл for ничего не возвращает!

ОДНАКО, когда я вызываю (void) fetchSectorList изнутри из класса ContentController, список "aircraft" возвращается циклом for.

- (NSFetchedResultsController *)stageResultsController {
    [self fetchSectorList];
    return [self resultsControllerForEntity:@"Stage"];
}

Почему тогда я не могу вызвать этот же метод из другого класса? Пожалуйста помоги. Весь вклад очень приветствуется.

Примечания:

1) Я объявляю NSManagedObjectModel, NSManagedObjectContext и NSPersistentStoreCoordinatorin ContentController.h 2) Я унаследовал скелет для кода основных данных из примера в Интернете. Он определяет метод класса, который используется другим классом в примере для инициализации класса.

+ (ContentController *)sharedInstance {
    static ContentController * instance = nil;
    if (!instance) {
        instance = [[ContentController alloc] init];

Однако я выбираю инициализацию из кода инициализатора, показанного выше в viewdidload () моего вызывающего класса (StageDetailViewController). Может ли это быть частью проблемы?

Спасибо за ваше терпение. Я был бы очень признателен за помощь. Я был бы рад предоставить разъяснения по любому из вышеперечисленных вопросов.

Решение !!!

Ребята, спасибо за все советы. Следуя комментариям Маркуса, я углубился в Singletons, и вызов, который дает желаемый результат от StageDetailViewController в -viewdidload (), просто:

[[ContentController sharedInstance] fetchSectorList];

Синглтон в моем приложении:

  • (ContentController *) sharedInstance

... всегда будет инициализироваться к моменту инициализации StageDetailViewController, поэтому, будучи одиночным, его нужно инициализировать только один раз во время выполнения приложения. Так что простой вызов метода fetchSectorList работает.

Маркус, извините, что связал ваше имя с Синглетонами ... Я клянусь расширить свой арсенал на более позднем этапе.

Ответы [ 3 ]

1 голос
/ 03 января 2012

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

Во-вторых, вы не используете синглтон должным образом.

- (void)viewDidLoad {
        [super viewDidLoad];
        ContentController * instance = nil;
        instance = [[ContentController alloc] init];
        [instance fetchSectorList];
        [instance release];

       ....other stuff ....

}

В этом коде вы не используете синглтон.Вы создаете объект, выполняете на нем метод, а затем уничтожаете его.Поэтому он не будет иметь никаких значений.

Измените этот код на:

- (void)viewDidLoad {
        [super viewDidLoad];
        ContentController * instance = [ContentController sharedInstance];
        [instance fetchSectorList];

       ....other stuff ....

}

И вы получите желаемые результаты, я подозреваю.

Обновление 1

У вас есть что-нибудь в постоянном магазине?

Возвращает ли * 1017 фактический объект или это ноль?

0 голосов
/ 05 января 2012

спасибо за все советы. Следуя комментариям Маркуса, я углубился в Singletons, и вызов, который дает желаемый результат от StageDetailViewController в -viewdidload (), просто:

[[ContentController sharedInstance] fetchSectorList];

Синглтон в моем приложении:

  • (ContentController *) sharedInstance

... всегда будет инициализироваться к моменту инициализации StageDetailViewController, и, поскольку он является единичным, его нужно инициализировать только один раз во время выполнения приложения. Так что простой вызов метода fetchSectorList работает.

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

0 голосов
/ 03 января 2012

В первом примере вы создаете новый объект ContentController, но не предоставляете ему контекст управляемого объекта.Таким образом, ваш вызов контекста для выполнения запроса на выборку будет передан в ноль, поэтому вы не получите никаких результатов.

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

...