gpt4 book ai didi

ios - 核心数据 : table view FRC number of fetched objects is zero

转载 作者:行者123 更新时间:2023-11-28 22:48:34 26 4
gpt4 key购买 nike

我在两个 TableView Controller 中实现核心数据。第一个显示银行名称、城市和州,第二个显示银行的详细信息,如 zip 、截止日期等。因此,我的模型中有两个实体。第一个称为“BankInfo”,第二个称为“BankDetails”。这两个实体是一对一的关系。

当我从第一个 Controller 转到第二个 Controller 时出现问题。看起来第二个 TableView Controller 中获取的对象数始终为零。这意味着 FRC 不获取任何内容。出了什么问题?

第一个表工作正常。而且我确信第二个实体已正确填充数据。我尝试删除谓词,在这种情况下 FRC 应该返回实体中的所有对象。但它仍然没有返回任何内容..

#import "SecondViewController.h"
#import "AppDelegate.h"

@interface SecondViewController () <NSFetchedResultsControllerDelegate>
@property (nonatomic,strong) NSFetchedResultsController *fetchedResultsController;
@end

@implementation SecondViewController
@synthesize bankInfo = _bankInfo;
@synthesize fetchedResultsController = _fetchedResultsController;

- (void)viewDidLoad
{
[super viewDidLoad];

self.fetchedResultsController.delegate = self;

NSError *error;

if (![self.fetchedResultsController performFetch:&error]) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}

[self.tableView reloadData];

NSLog(@"Frist fetched object is %@",[[self.fetchedResultsController fetchedObjects] objectAtIndex:0]);
}


- (void)setBankInfo:(BankInfo *)bankInfo
{
_bankInfo = bankInfo;
}

- (NSFetchedResultsController *)fetchedResultsController
{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"BankDetails"];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"info.state = %@",self.bankInfo.state];
[request setPredicate:predicate];

[request setSortDescriptors: [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"zip"
ascending:YES
]]];
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = appDelegate.managedObjectContext;

_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];

return _fetchedResultsController;
}
// FRC delegate methods...
@end

最佳答案

每次调用您的 getter 函数 fetchedResultsController 都会创建一个新的 FRC。

所以当你打电话

[[self.fetchedResultsController fetchedObjects] objectAtIndex:0]

然后 fetchedResultsController 被调用,创建一个新的 FRC,将其存储在 _fetchedResultsController 中,并返回新的 FRC。由于从未在此新 FRC 上调用过 performFetch,因此 fetchedObjects 为空。也没有为新的 FRC 设置委托(delegate)。

同样的事情可能发生在 TableView 委托(delegate)方法中。

您可以通过在 fetchedResultsController 中设置断点或向该方法添加一些 NSLog() 来轻松验证这是否是问题所在。

您可能想要做的是惰性 getter 函数。在该方法中设置委托(delegate)并执行提取也很有意义。

- (NSFetchedResultsController *)fetchedResultsController
{
if (_fetchedResultsController == nil) {
/* ... create request, predicate, sort descriptor ... */
_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
_fetchedResultsController.delegate = self;
[_fetchedResultsController performFetch:&error]; // error handling omitted
}
return _fetchedResultsController;
}

如果搜索条件发生变化,您只需设置 _fetchedResultsController = nil 即可强制创建新的 FRC。

关于ios - 核心数据 : table view FRC number of fetched objects is zero,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12557343/

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