我有一个具有开启和关闭模式的应用程序。
在线模式下,我正在检查登录服务器,
下载XML文件并解析该文件。所有数据都写入coreData。
我用NSFetchedResultsController填充我的TableView。
如果我使用关闭模式(要使用离线模式,coreData实体不应为零),
我只是关闭视图以显示带有来自coreData的数据的tableView。
问题在于:如果我使用离线模式,数据无法正确排序 reloadData不起作用,我已经尝试了更多次。
我如何重新加载tableView,所以我也能在关闭模式下正确排序数据?
修改1:
在关闭模式下我只会这样做:
if (xmlFile) {
//FadeOut animation nach erfolgreichem Login
//und removeFromSuperview
[UIView animateWithDuration:0.8
animations:^{loginView.alpha = 0.0;}
completion:^(BOOL finished){ [loginView removeFromSuperview]; }];
}
如何在viewDidAppear上对tableview进行排序?
编辑2:
这是我的NSFetchedResultsController:
#pragma mark - Fetched results controller
- (NSFetchedResultsController *)fetchedResultsController
{
if (__fetchedResultsController != nil)
{
return __fetchedResultsController;
}
/*
Set up the fetched results controller.
*/
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntitySetsCards" inManagedObjectContext:self.managedObjectContext];
NSPredicate *inboxPred = [NSPredicate predicateWithFormat:@"archived == 0"];
[fetchRequest setEntity:entity];
// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];
[fetchRequest setPredicate:inboxPred];
// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptorSetOrder = [[[NSSortDescriptor alloc] initWithKey:@"sortOrder" ascending:YES] autorelease];
NSSortDescriptor *sortDescriptorColorOrder = [[[NSSortDescriptor alloc] initWithKey:@"colorOrder" ascending:YES] autorelease];
NSSortDescriptor *sortDescriptorSortOrder = [[[NSSortDescriptor alloc] initWithKey:@"sortingOrder" ascending:YES] autorelease];
NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortDescriptorSetOrder, sortDescriptorSortOrder, sortDescriptorColorOrder, nil] autorelease];
[fetchRequest setSortDescriptors:sortDescriptors];
// nil for section name key path means "no sections".
// cacheName auf nil gesetzt, da @"Root" fehler erzeugt hat (FATAL ERROR)
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"setTitle" cacheName:nil];
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. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.
*/
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
allFetchedCards = aFetchedResultsController;
allCards = [__fetchedResultsController fetchedObjects];
return __fetchedResultsController;
}
答案 0 :(得分:2)
默认情况下,不会对存储在数据库中的数据进行排序。您有责任对其进行排序。根据您的数据结构,您可以添加索引以帮助排序,也可以按名称,lastSeenDate等逻辑值进行排序。
发布从Core Data检索数据的代码(可能是您创建的NSFetchedResultsController
)。
你真的不想在NSFetchedResultsController
之外排序,因为这涉及很多努力和代码,这是非常不必要的。您应该配置NSFetchedResultsController
以按照您在屏幕上显示它的方式进行排序。真的没有理由做两次。排序是非破坏性和非持久性的。
但是如果您绝对必须排序两次,那么您需要:
-fetchedObjects
或-sections
然后-objectAtIndex:
然后-objects
收集对象数组,以获取某个部分的数组。-sortedArrayUsingDescriptors:
进行最终排序。正如我所说,你真的不想这样做。您需要在与代码中的NSFetchedResultsController
进行交互的每个点上执行此操作,典型UITableViewController
中的NSFetchedResultsController
大约为5分。大量额外的零值代码。
另外一个问题:您是否使用-tableView: cellForRowAtIndexPath:
来显示单元格的数据?你可以发布你的{{1}}吗?