0

オンとオフのモードを備えたアプリがあります。オンライン モードでは、サーバーへのログインを確認し
、XML ファイルをダウンロードしてそのファイルを解析しています。すべてのデータは coreData に書き込まれます。

TableView に NSFetchedResultsController を設定しています。

オフ モードを使用する場合 (オフライン モードを使用するには、coreData エンティティを nil にしないでください)、
ビューを閉じて、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 でテーブルビューをソートするにはどうすればよいですか?

編集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;
}    
4

1 に答える 1

2

データベースに格納されたデータは、デフォルトではソートされません。それを分類するのはあなたの責任です。データ構造に応じて、並べ替えに役立つインデックスを追加するか、名前、lastSeenDate などの論理値で並べ替えることができます。

Core Data からデータを取得しているコードを投稿します (おそらく の作成NSFetchedResultsController)。

OP1への対応

NSFetchedResultsController多くの労力と本当に不必要なコードが必要になるため、の外でソートすることは本当に望ましくありません。画面に表示する方法で並べ替えるように構成する必要がありNSFetchedResultsControllerます。2回やる理由は特にありません。並べ替えは、非破壊的かつ非永続的です。

ただし、絶対に 2 回ソートする必要がある場合は、次のことを行う必要があります

  1. オブジェクトの配列を経由-fetchedObjectsまたは経由で収集し、セクションの配列-sectionsを取得します。-objectAtIndex:-objects
  2. 配列が手元にあれば、呼び出し-sortedArrayUsingDescriptors:て最終的な並べ替えを生成できます。

私が言ったように、あなたは本当にこれをしたくありません。コード内で操作したすべてのポイントでこれを行う必要がありますがNSFetchedResultsController、通常UITableViewControllerは約 5 ポイントです。ゼロ値のための余分なコードがたくさんあります。

追加の質問: を使用しNSFetchedResultsControllerてセルのデータを表示していますか? 投稿できます-tableView: cellForRowAtIndexPath:か?

于 2012-01-16T17:44:22.917 に答える