fetchedResultsController fetchedObjects, возвращающий NSCFString вместо NSArray - PullRequest
0 голосов
/ 24 марта 2012

Я пытаюсь настроить UITableView с Core Data, используя fetchedResultsController.

Сам запрос выглядит нормально.Я проверяю его с помощью оператора executeFetchRequest.

Я вызываю executeFetch без ошибок.

Когда я пытаюсь получить доступ к fetchedObjects, я получаю EXC_BAD_ACCESS.

Просмотр возвращаемой переменнойв Xcode кажется, что он возвращает _NSCFString вместо NSArray.

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

Ниже приведены разделы кода:

.h файл

@interface MainViewController : UIViewController <NSFetchedResultsControllerDelegate> {

NSFetchedResultsController *_fetchedResultsController;
}

@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController;

.m файл

@synthesize fetchedResultsController = _fetchedResultsController;

- (NSFetchedResultsController *)fetchedResultsController {

if (_fetchedResultsController != nil) {
    return _fetchedResultsController;
}

/*
 Set up the fetched results controller.
 */
// Create the fetch request for the entity.

 NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Ingredient"];
 request.predicate = [NSPredicate predicateWithFormat:@"recipe.name = %@",[self theRecipe].name];
 NSSortDescriptor *aSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"sequenceNumber" ascending:YES];
 request.sortDescriptors = [NSArray arrayWithObject:aSortDescriptor];

NSError *error = nil;
NSArray *ingredients = [[self managedObjectContext] executeFetchRequest:request error:&error];

if (!ingredients) {
    NSLog(@"** No Ingredients found");
} else if ([ingredients count] >= 0) {
    NSLog(@"**%d Ingredients found", [ingredients count]);
} 

// Edit the section name key path and cache name if appropriate.
// nil for section name key path means "no sections".
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:[self managedObjectContext] sectionNameKeyPath:nil cacheName:@"myCache"];
aFetchedResultsController.delegate = self;
[self setFetchedResultsController:aFetchedResultsController];

return _fetchedResultsController;
}    

Inside ViewDidLoad

NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {

    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

NSLog(@"fetchRequest = .... %@",[[self fetchedResultsController] fetchRequest]);
NSLog(@"fetchedObjects = .... %@",[[self fetchedResultsController] fetchedObjects]);
NSLog(@"lastObject = .... %@",[[[self fetchedResultsController] fetchedObjects] lastObject]);
Ingredient *test = [[[self fetchedResultsController] fetchedObjects] lastObject];
NSLog(@"test = %@", test.ingredient);
NSArray *fetchedObjects = [[self fetchedResultsController] fetchedObjects];  // EXC_BAD_ACCESS hit here
NSLog(@".... ingredients count = %@", [fetchedObjects count]);

Результат из моего метода executeFetchRequest внутри метода fetchedResultsController

2012-03-24 08:46:23.171 My App[103:707] **8 Ingredients found

Вот вывод журнала, который я получаю:

2012-03-24 08:46:23.186 My App[103:707] fetchRequest = .... <NSFetchRequest: 0x2c5180> (entity: Ingredient; predicate: (recipe.name == "Lasagne"); sortDescriptors: ((
"(sequenceNumber, ascending, compare:)"
)); type: NSManagedObjectResultType; )

2012-03-24 08:46:23.192 My App[103:707] fetchedObjects = .... (
"<Ingredient: 0xee23e80> (entity: Ingredient; id: 0xee23100 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p9> ; data: <fault>)",
"<Ingredient: 0xee24120> (entity: Ingredient; id: 0xee23160 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p3> ; data: <fault>)",
"<Ingredient: 0xeed59a0> (entity: Ingredient; id: 0xee23170 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p7> ; data: <fault>)",
"<Ingredient: 0xeed5a00> (entity: Ingredient; id: 0xee23180 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p2> ; data: <fault>)",
"<Ingredient: 0xee243c0> (entity: Ingredient; id: 0xee23190 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p5> ; data: <fault>)",
"<Ingredient: 0xee24410> (entity: Ingredient; id: 0xee231a0 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p1> ; data: <fault>)",
"<Ingredient: 0xee24460> (entity: Ingredient; id: 0xee231b0 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p6> ; data: <fault>)",
"<Ingredient: 0xee244c0> (entity: Ingredient; id: 0xee231c0 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p8> ; data: <fault>)"

)

Показывает 8 записей результатов.Это то, что я ожидаю.

2012-03-24 08:46:23.195 My App[103:707] lastObject = .... <Ingredient: 0xee244c0> (entity: Ingredient; id: 0xee231c0 <x-coredata://E3F4AFFB-B14F-4E94-80B1-F6101F92FAAD/Ingredient/p8> ; data: <fault>)

2012-03-24 08:46:23.198 My App[103:707] test = Salt

Опять же, это значение, которое я ожидаю.

(gdb) 

Так почему же результат fetchedObjects не является NSArray, и как можноЯ делаю это один?

Цените любую помощь.

1 Ответ

1 голос
/ 24 марта 2012

Я думаю, что ваш код падает в этой строке:

NSLog(@".... ingredients count = %@", [fetchedObjects count]);  

%@ указывает на объект. Это должно быть %i. [fetchedObjects count] возвращает NSUInteger, который не является объектом. Поэтому строка должна выглядеть так:

NSLog(@".... ingredients count = %i", [fetchedObjects count]);

Посмотрите на эту страницу: Спецификаторы формата строки

...