gpt4 book ai didi

iphone - 如果其谓词使用 IN,则不会调用 NSFetchedResultsControllerDelegate 方法?

转载 作者:行者123 更新时间:2023-12-03 20:01:03 24 4
gpt4 key购买 nike

我正在结合 NSFetchedResultsController 实现 UITableViewController。当 UITableViewController 实例化时,基于用户在前一个 Controller 上所做的选择,使用不同的谓词构造 NSFetchedResultsController(与 CoreDataBooks 示例的方式基本相同)。
有时我会这样设置谓词:

predicate = [NSPredicate predicateWithFormat:@"container = %@", aManagedObject];

有时会这样:

predicate = [NSPredicate predicateWithFormat:@"container IN (%@)", aNSMutableSetOfObjectsID];

两个谓词都工作正常,因为它们按预期正确获取了我的所有对象。当我在设置第二个谓词时尝试将新的托管对象插入列表时,就会出现问题。事实上,在这种情况下,FRC 委托(delegate)方法永远不会被调用,因此 TableView 不会自动更新。
我确信新对象已正确添加到 FRC 使用的同一上下文中,并且其“容器”关系已设置,以便应触发委托(delegate),但事实并非如此!

我尝试过的:

我说第二个谓词工作正常,因为如果我添加一个新对象,然后弹出 UITableViewController 并再次推送它,强制重新获取所有数据,新对象就会毫无问题地出现在列表中。
我做的另一个测试是在添加新对象后立即强制重新计算 FRC:

NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
exit(-1);
}
[self.tableView reloadData];

新对象正确显示。

代码:

- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController == nil) {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSManagedObjectContext *managedObjectContext = realEstate.managedObjectContext;

[fetchRequest setEntity:[NSEntityDescription entityForName:@"Item" inManagedObjectContext:managedObjectContext]];
[fetchRequest setPredicate:[self getBasePredicate]];

NSSortDescriptor *nameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name"
ascending:YES
selector:@selector(localizedCaseInsensitiveCompare:)];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:nameDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[nameDescriptor release];
[sortDescriptors release];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:managedObjectContext
sectionNameKeyPath:@"sectionIndex"
cacheName:nil];
self.fetchedResultsController = aFetchedResultsController;
fetchedResultsController.delegate = self;
[aFetchedResultsController release];
[fetchRequest release];
}

return fetchedResultsController;
}


// return a predicate for the fetchedResultsController
- (NSPredicate *)getBasePredicate {
NSPredicate *predicate = nil;

if ([[managedObject valueForKey:@"subcontainersCount"] intValue] == 0)
// container without sons **(FIRST PREDICATE)**
predicate = [NSPredicate predicateWithFormat:@"container = %@", managedObject];
else {
// container with sons **(SECOND PREDICATE)**
predicate = [NSPredicate predicateWithFormat:@"container IN (%@)", [Container allDescendantsObjectID:(Container *)managedObject includeSource:YES]];
}

return predicate;
}


- (void)addNewItem {
Item *newItem = (Item *)[NSEntityDescription insertNewObjectForEntityForName:@"Item"
inManagedObjectContext:realEstate.managedObjectContext];
newItem.name = @"my new item";
newItem.container = aContainerManagedObject;

NSError *error = nil;
if (![realEstate.managedObjectContext save:&error]) {
abort();
}
}

我使用的 NSFetchedResultsControllerDelegate 方法取自“更多 iPhone 3 开发”。完整代码可见here (第 30-31、35 页)。
如果需要的话我可以在这里发帖。

最佳答案

解决了将对象 ID 替换为谓词中的 NSManagedObject 的问题。

之前:[NSPredicate predicateWithFormat:@"container IN (%@)", aNSMutableSetOfObjectsID];

之后:[NSPredicate predicateWithFormat:@"container IN (%@)", aNSMutableSetOfNSManagedObject];

由于某些原因,如果谓词使用 ID 而不是确切的 NSManagedObjects 获取对象,则不会调用 FRC 委托(delegate)。
我正在 iPhoneOS 3.1.3 和 3.2 上进行测试。然而iPhoneOS 4.0应该支持objectsID和NSManagedObject并正确调用FRC委托(delegate)方法,但我现在无法在4.0上进行测试。

关于iphone - 如果其谓词使用 IN,则不会调用 NSFetchedResultsControllerDelegate 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3167616/

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