2013-09-19 2 views
1

У меня есть головоломка на руках.Xcode NSFetchRequest Не исполняется

Я делаю NSFetchRequest в моей базе данных SQLite в Xcode и запрос я бегу довольно прост:

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
NSManagedObjectContext *context = [appDelegate managedObjectContext]; 
[[context undoManager] disableUndoRegistration]; 
NSError *error = nil; 
NSEntityDescription *entity = nil; 

entity = [NSEntityDescription entityForName:@"Workbook" inManagedObjectContext:context]; 

[request setEntity:entity]; 
[request setPredicate:[NSPredicate predicateWithFormat:@"language == 'English'" ]]; 
[request setSortDescriptors:[NSArray arrayWithObject:[[NSSortDescriptor alloc]initWithKey:@"sequence" ascending:YES]]]; 

NSLog(@"----- Request Print out: %@",request); 
NSArray *subjects = [context executeFetchRequest:request error:&error]; 

В первый раз этот код работает он выполняет отлично.

я тогда изменить свою точку зрения и выполнить другую выборку и вставить в другой части приложения перейти обратно к виду, где размещен этот код и код затем не выполняет:

[context executeFetchRequest:request error:&error]; 

приложение Безразлично» t замораживание или сбой, и на консоли не отображаются сообщения об ошибках. Я даже включил протоколирование для своих SQL-запросов и я вижу, что sql для запроса никогда не выполняется во второй раз.

выборки запрос при входе выглядит следующим образом:

<NSFetchRequest: 0x20063120> (entity: Workbook; predicate: (language == "English"); sortDescriptors: (("(sequence, ascending, compare:)")); type: NSManagedObjectResultType;) 

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

Возможно ли, что мой db заблокирован каким-то образом после предыдущих операций?

Может ли приложение свободно подключаться к БД, если БД не получает запрос?

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

Я попробовал все профилирование и т.д., что я могу думать, но не может найти что-нибудь очевидное, как утечки или странные процессы, происходящие.

Все оцененная помощь

+0

Если вы используете управление отменами, вам нужно вызвать 'processPendingChanges' в контексте перед отключением диспетчера отмены ([см. Здесь] (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData /Articles/cdUsingMOs.html)). что вы подразумеваете под «не выполнить»? он возвращает нуль или пустой массив? –

+0

@ DanShelly он не возвращает ничего, что код прекращает выполнение в '[context executeFetchRequest: request error: & error];' и массив даже не заполняется ... Почему я хочу использовать менеджер отмены? Вы просто предлагаете отключить его? – H2wk

+0

Эта строка: '[[контекст undoManager] disableUndoRegistration];' предлагаю вам использовать отмену управления, и его следует преследовать 'processPendingChanges'. чтобы не использовать управление отменой, просто установите диспетчер отмены на создание nil' uppon. «перестает исполнять» означает остановку (== app freez)? используете ли вы резьбу с тем же контекстом? –

ответ

0

По этой ссылке вы предоставили, и глядя на MBProgressHUD источника, то ясно, что вы обращаетесь к вашему контексту из различных потоков затем те, что были созданы на (нити confinment нарушения), а не с помощью контекст частной очереди.

прогресс HUD отделяет новый поток для выполнения селектора, в то время как контекст, вероятно, определяется как параллелизм «континент» или «основной поток».

В первый раз контекст создается на отдельном потоке (T1), а когда вы снова вернетесь к контроллеру представления, он используется в другом отдельном потоке (T2).

Поскольку я действительно не знаю MBProgressHUD, я советую вам найти метод, который выполняет селектор, который вы вызываете в основном потоке, в то время как прогресс HUD выполняет свою задачу.
Или выполните эту загрузку во временном контексте (тот, который будет создан в выделенном потоке и размещен на потоке, который затем будет экспортировать результаты в главный контекст/поток.

CoreData не позволяет прохождение управляемых объектов или управляемых контекстов между потоками

Быстрое исправление будет:
(это решение импортировать данные в виде словарей на временной ограниченном контексте)

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType]; 
context.persistentStoreCoordinator = appDelegate.persistentStoreCoordinator; 
context.undoManager = nil; 
NSError *error = nil; 
NSEntityDescription *entity = nil; 

entity = [NSEntityDescription entityForName:@"Workbook" inManagedObjectContext:context]; 

[request setEntity:entity]; 
[request setPredicate:[NSPredicate predicateWithFormat:@"language == 'English'" ]]; 
[request setSortDescriptors:[NSArray arrayWithObject:[[NSSortDescriptor  alloc]initWithKey:@"sequence" ascending:YES]]]; 
[request setResultType:NSDictionaryResultType]; 
[request setPropertiesToFetch:@[/*the properties you need*/]]; 

NSLog(@"----- Request Print out: %@",request); 
NSArray *subjects = [context executeFetchRequest:request error:&error]; 
//you can now pass subjects between thread as it contains 
//dictionaries and not managed objects 
+0

Я дам этому поход в среду ... Я могу подтвердить, что он выглядит как проблема с потоками, потому что если i комментировать MBProgressHUD в обоих представлениях, кажется, что приложение работает без проблем ... В первый раз у меня была проблема с MBProgressHUD, поскольку я использовал ее в других проектах без проблем ... – H2wk

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