gpt4 book ai didi

ios - 在后台获取核心数据对象 : objects not faulted

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:04:48 25 4
gpt4 key购买 nike

在将 Core Data 中的对象与 GCD 结合使用时,我需要一些帮助;我似乎得到了没有错误进入主线程的 NSManagedObjects,即使我访问它们的属性也是如此。非常感谢您的帮助。

这就是我正在做的事情:启动时,我需要从 Core Data DB 加载人员列表,在后台进行一些自定义处理,然后重新加载表格以显示姓名。我通过仅将 objectID 传递到 GCD 队列来遵循 Core Data 多线程指南。但是当我在主线程上重新加载 tableview 时,我从来没有看到为联系人显示的名称(或其他属性),并且在仔细检查时,NSManagedObjects 原来是主线程上的错误,即使我访问了各种属性cellForRowAtIndexPath。当我 NSLog 时,名称属性在后台线程中可见;并且它还在 cellForRowAtIndexPath 的 NSLogs 主线程上正确显示。但无论我做什么,它们都不会显示在 tableView 中。我尝试使用点表示法和 valueForKey 访问 name 属性,但均无效。

这是我的代码……它是从 FRC 初始值设定项中调用的:

- (NSFetchedResultsController *)fetchedResultsController 
{
if (__fetchedResultsController != nil)
{
return __fetchedResultsController;
}

__fetchedResultsController = [self newFetchedResultsControllerWithSearch:nil]; // creates a new FRC

[self filterAllContactsIntoDictionary: __fetchedResultsController];
return [[__fetchedResultsController retain] autorelease];
}


- (void) filterAllContactsIntoDictionary: (NSFetchedResultsController *) frc
{

NSArray *fetchedIDs = [[frc fetchedObjects] valueForKey:@"objectID"];
NSArray *fetched = [frc fetchedObjects];

if (filterMainQueue == nil) {
filterMainQueue = dispatch_queue_create("com.queue.FilterMainQueue", NULL);
}
dispatch_async(self.filterMainQueue, ^{

NSManagedObjectContext *backgroundContext = [[[NSManagedObjectContext alloc] init] autorelease];
[backgroundContext setPersistentStoreCoordinator:[[self.fetchedResultsController managedObjectContext] persistentStoreCoordinator]];
NSMutableArray *backgroundObjects = [[NSMutableArray alloc] initWithCapacity: fetchedIDs.count];

// load the NSManagedObjects in this background context
for (NSManagedObjectID *personID in fetchedIDs)
{
Person *personInContext = (Person *) [backgroundContext objectWithID: personID];
[backgroundObjects addObject:personInContext];
}
[self internal_filterFetchedContacts: backgroundObjects]; // loads contacts into custom buckets

// done loading contacts into character buckets ... reload tableview on main thread before moving on
dispatch_async(dispatch_get_main_queue(), ^{

CGPoint savedOffset = [self.tableView contentOffset];
[self.tableView reloadData];
[self.tableView setContentOffset:savedOffset];

});
});
}

我在这里做错了什么?有没有其他方法可以显式地使 Person 对象在主线程上触发它们的错误?还是我在 GCD 队列和核心数据上做错了我不知道的事情?谢谢。

最佳答案

为什么不采取简单的方法,因为您没有保存任何新内容?不要为后台线程创建额外的上下文并使用 ID,而是在锁定后在后台线程中使用主 managedObjectContext

例如:

- (void) filterAllContactsIntoDictionary: (NSFetchedResultsController *) frc
{

if (filterMainQueue == nil) {
filterMainQueue = dispatch_queue_create("com.queue.FilterMainQueue", NULL);
}
dispatch_async(self.filterMainQueue, ^{

NSManagedObjectContext *context = ... // get the main context.
[context lock]; // lock the context.

// do something with the context as if it were on the main thread.

[context unlock]; // unlock the context.

dispatch_async(dispatch_get_main_queue(), ^{
CGPoint savedOffset = [self.tableView contentOffset];
[self.tableView reloadData];
[self.tableView setContentOffset:savedOffset];
});
});
}

当我用 performSelectorInBackground 调用方法时,这对我有用,所以我想它也应该适用于 GCD 调度。

关于ios - 在后台获取核心数据对象 : objects not faulted,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8447551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com