0

コンテンツがコア データ データベースにプッシュされたらすぐにテーブルビューを更新する必要があります。

この AppDelegate.m には次のコードが含まれています

NSManagedObjectContext *moc = [self managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];

[request setEntity:[NSEntityDescription entityForName:@"FeedItem" inManagedObjectContext:moc]];
//for loop
// push data in code data & then save context  
[moc save:&error];

ZAssert(error == nil, @"Error saving context: %@", [error localizedDescription]);
//for loop ends 

このコードは、RootviewController.m から次のコードをトリガーします。

- (void)controllerWillChangeContent:(NSFetchedResultsController*)controller 
{
[[self tableView] beginUpdates];
}

ただし、これは for ループの最後にのみテーブルビューを更新します。テーブルは db にすぐにプッシュした後は更新されません。

次のコードを試しましたが、うまくいきませんでした

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
// In the simplest, most efficient, case, reload the table view.
[self.tableView reloadData];
}

この問題で数日間立ち往生しています.助けてください.解決策を前もって感謝します.

4

1 に答える 1

0

メインスレッドで最初のコードを実行しているようです。このスレッドは UI の更新も制御するため、ループが終了するまで何も起こりません。これを解決するには3つの方法があります。

1) 2 番目のスレッドからコアデータを更新し、メッセージをメイン スレッドに渡して、UI を更新するように伝えます。これを行うのは非常にトリッキーです -いくつかの恐ろしい警告については、コア データ マルチスレッドのドキュメントを参照してください。

2) for ループで更新を行わないでください。代わりに、タイマーの一部として実行してください。これにより、各挿入間で UI が更新される時間が与えられます。

    ...
    self.stuffToUpdate = [NSMutableArray arrayWithObjects:...];
    [NSTimer scheduledTimerWithInterval:0.1 target:self selector:@selector(doStuff:) userInfo:nil repeats:YES];
    ...

- (void) doStuff:(NSTimer *)timer {
    // If there's noting to update, bail
    if (0 == stuffToUpdate.count) {
        [timer invalidate];
        return;
    }

    // Get the next object to update
    id object = [stuffToUpdate objectAtIndex:stuffToUpdate.count-1];
    [stuffToUpdate removeLastObject];

    // Do stuff to object
    [object doStuff];

    // Save
    NSError &error = nil;
    [moc save:&error];

    // Tell the table to update
    [self.tableView reloadData];
}

ただし、このようにテーブルを継続的に更新すると、奇妙なユーザー インターフェイスの問題が発生する可能性があります。ユーザー テストで試して、問題なく動作するかどうかを確認する必要があります。また、これによりコアデータの更新にかかる合計時間が遅くなりますが、UI を常に更新している場合は問題にならない可能性があります。

3) コアデータが入力されている間、アクティビティ インジケーターを含む「お待ちください」メッセージが表示されるように、アプリを変更してください。これははるかに簡単に実行できますが、更新に時間がかかると、ユーザーが先送りになる可能性があります。

于 2010-05-12T10:12:47.460 に答える