3

私は NSOperation サブクラスを持っています。これがメインのメソッドです:

(void)main
{
    NSAutoreleasePool *Pool = [[NSAutoreleasePool alloc] init];

    managedObjectContext = [NSManagedObjectContext contextThatNotifiesDefaultContextOnMainThread];

    Message *message = (Message *) [managedObjectContext objectWithID:self.messageID];
    message.status = [NSNumber numberWithInt:SKMessageSendStateStart];
    [message save];
    [self send];
    [self finish];
    [Pool drain];
}

fetchResultController と defaultContext を次のように定義します。

(BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [MagicalRecordHelpers setupCoreDataStackWithStoreNamed:@"Shark"];

    self.context = [NSManagedObjectContext context];
    [NSManagedObjectContext setDefaultContext:self.context];

    self.fetchController = [Message fetchRequestAllGroupedBy:nil withPredicate:nil sortedBy:@"text" ascending:YES];
    [self.fetchController setDelegate:self];
    [self.fetchController performFetch:nil];
}

[メッセージ保存] を呼び出すたびに、コンソール ログアウト: -NSManagedObjectContext(MagicalRecord) mergeChangesFromNotification: Merging changes to * DEFAULT 環境メインスレッドで *

しかし、NSFetchedResultsControllerDelegate が呼び出されることはありません。これは、FetchedResultsController を間違って設定したということですか? 私は完全に混乱しています。

前もって感謝します。

4

2 に答える 2

4

これが機能しない理由は、MagicalRecord が自動的に performFetch: を呼び出すため、事前にデリゲートを設定できないためです。

また、applicationDidFinishLaunching: メソッドで、次の行を削除します。

self.context = [NSManagedObjectContext context];
[NSManagedObjectContext setDefaultContext:self.context];

この場合、デフォルトのコンテキストを変更したくありません。setupCoreDataStackWithStoreNamed:... を呼び出すと、MagicalRecord が処理を行います。つまり、そのメソッドが完了すると、MOC は既に使用可能です。作成されたものを破棄して、デフォルトのコンテキストを新しいインスタンスに設定する必要はありません。この特定のケースでは。

また、コンテキストを使用して MagicalRecord が提供するフェッチ メソッドの 1 つに渡すだけの場合は、コンテキストを保持する必要はありません。MagicalRecord は、その使用のために単一のコンテキスト (「デフォルト」コンテキスト) を作成し、それを使用するだけです...

于 2011-10-26T04:17:03.973 に答える
1

[NSManagedObjectContext context] の意味を誤解していました。メインスレッドに新しいコンテキストを作成します。fetchResultController モニターのコンテキストは、変更がマージされたコンテキストと同じではないため、NSFetchedResultsControllerDelegate は呼び出されません。

[NSManagedObjectContext context] を [NSManagedObjectContext defaultContext] に変更すると問題が解決しました。

于 2011-10-15T02:50:04.803 に答える