这是我正在尝试做的简化版本:
我有一个使用 UITabBarController 作为根控制器的应用程序。在两个选项卡中,我有一个 UINavigationController,其中包含一个自定义 UITableViewController。
其中一个 Tableview 用于显示“特色”项目,另一个用于显示“用户”项目。
第一个 API 端点是:/api/items/featured,另一个端点是:/api/items/user
我经历了在我的 AppDelegate.m 中设置所有内容的整个过程:
// Configure the object manager
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:API_SERVER]];
objectManager.managedObjectStore = managedObjectStore;
[RKObjectManager setSharedManager:objectManager];
RKEntityMapping *entityMapping = [RKEntityMapping mappingForEntityForName:@"Item" inManagedObjectStore:managedObjectStore];
[entityMapping addAttributeMappingsFromDictionary:@{
@"id": @"itemID",
@"type": @"type",
@"created_at": @"created_at":
@"field1": @"field1"}];
// User Descriptor
RKResponseDescriptor *userDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:entityMapping pathPattern:@"/api/items/user" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:userDescriptor];
// Featured Listing Decriptor
RKResponseDescriptor *featuredDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:entityMapping pathPattern:@"/api/items/featured" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:responseDescriptor];
然后在 TableViewControls 我有以下内容(在第二个 tableview 控制器中用 'user' 代替 'featured')
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self loadItems];
}
- (void)loadItems {
[[RKObjectManager sharedManager] getObjectsAtPath:@"/api/items/featured" parameters:nil
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
self.lastupdate = [[NSDate alloc] init];
}
failure:^(RKObjectRequestOperation *operation, NSError *error) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"An Error Has Occurred" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
}];
}
- (NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
RKManagedObjectStore *managedObjectStore = [RKManagedObjectStore defaultStore];
self.managedObjectContext = managedObjectStore.mainQueueManagedObjectContext;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];
// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"created_at" ascending:NO];
NSArray *sortDescriptors = @[sortDescriptor];
[fetchRequest setSortDescriptors:sortDescriptors];
// Set predicate to only get Featured Listings
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"type like 'featured'"];
[fetchRequest setPredicate:predicate];
// Edit the section name key path and cache name if appropriate.
// nil for section name key path means "no sections".
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Master"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _fetchedResultsController;
}
现在这一切都适用于第一个选项卡(目前它返回 8 个项目,type = 'featured',显示在表中)。
当我切换到第二个选项卡时,问题就来了。它目前只返回 1 个 type='user' 的项目,并崩溃:
CoreData:错误:严重的应用程序错误。在核心数据更改处理期间捕获到异常。这通常是 NSManagedObjectContextObjectsDidChangeNotification 观察者中的一个错误。 * -[__NSArrayM objectAtIndex:]:索引 3 超出了带有 userInfo 的空数组的界限(null)
如果我省略了“用户”选项卡上的谓词,那么“特色”选项卡可以正常工作,“用户”选项卡会在其表中获取“特色”项目,而“用户”项目在顶部。
由于两个 tableview 控件的代码是相同的,除了“用户”和“功能”之外,我不知道问题出在哪里。