【发布时间】:2012-03-31 20:03:23
【问题描述】:
如果我像这样在viewDidLoad 中执行提取,我有一个核心数据应用程序运行时不会崩溃:
- (void) performCoreDataFetch {
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
exit(-1); // Fail
}
}
- (void)viewDidLoad {
[super viewDidLoad];
[self performCoreDataFetch];
}
上述执行获取方式的唯一问题是,如果要返回的数据很大,它会冻结应用程序几秒钟(但确实返回正确的结果而不会每次都崩溃),所以为了避免这种情况我决定使用 dispatch_async(代码如下)并在其中调用[self performCoreDataFetch]。
但是如果我在 dispatch_sync within viewDidLoad 中运行同样的 [self performCoreDataFetch],如下所示:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self performCoreDataFetch];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
});
在 dispatch_async 中调用 [self performCoreDataFetch] 会导致应用随机崩溃,并说“-[NSFetchRequest fetchLimit]: message sent to deallocated instance”
我的 fetchedResultsController 方法如下所示:
- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController != nil) {
return fetchedResultsController;
}
// Create and configure a fetch request with the Organization entity
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"Organization" inManagedObjectContext:managedObjectContext];
request.fetchBatchSize = 20;
// create sortDescriptor array
NSSortDescriptor *nameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
NSArray *sortDescriptorArray = [NSArray arrayWithObjects:nameDescriptor, nil];
request.sortDescriptors = sortDescriptorArray;
NSPredicate *predicate = nil;
predicate = [NSPredicate predicateWithFormat:@"state LIKE %@", filterByState];
[request setPredicate:predicate];
// Create and initialize the fetchedResultsController
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc ] initWithFetchRequest:request managedObjectContext:managedObjectContext sectionNameKeyPath:@"uppercaseFirstLetterOfName" cacheName:nil];
self.fetchedResultsController = aFetchedResultsController;
fetchedResultsController.delegate = self;
// Memory management
filterByState = nil;
// [sortDescriptorArray release];
[nameDescriptor release];
// [predicate release];
[request release];
[aFetchedResultsController release];
return fetchedResultsController;
}
【问题讨论】:
-
你想完成什么?您不必自己调用
performFetch方法... -
如果没有 performFetch,我不知道执行核心数据获取的另一种方法。
-
你想完成什么?如果你懒惰地初始化 fetched results 控制器,那么将在那里完成获取,而无需你自己调用
performFetch。再说一次,你想用 fetch 做什么? -
这是我想要做的:如果你查看我的 fetchedResultsController 方法,有一个谓词参数“filterByState”。这个变量通过不同的 tableViewController 传递给这个 UITableViewController。基于该谓词,此 fetchedResultsController 返回的数据集每次都不同。如果这仍然不清楚,请告诉我。
标签: core-data nsfetchedresultscontroller objective-c-blocks grand-central-dispatch