0

電話をすると気づきました

[context save:nil];

保存はすぐには行われません。1〜2秒でアプリを保存して終了しようとすると、それをテストしました。アプリを5秒以上開いたままにしておくと機能します。

2つの質問があります:

  • 保存が完了したことをどのように知ることができますか?テスト目的のためだけに、単純なNSLog()で十分です。
  • 保存を強制できますか?するべきか?

[コンテキスト保存]が同期しているかどうかのテスト

私はそれを何度もテストしましたが、これは私が得ている動作ではありません。私がこのコードを持っている場合:

[context save:nil]
NSLog(@"Saved");

「保存済み」ログが表示され、アプリを終了します。もう一度起動してデータを取得しようとすると、何も表示されません。「保存済み」メッセージが表示されてから約5〜10秒待つと、これは発生しません。

考え?

いくつかのコード

- (void)storeSales:(NSArray *)sales {
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"EE LLLL d HH:mm:ss Z YYYY"];

    for (NSDictionary *saleDictionary in sales) {
        Sale *sale = [NSEntityDescription insertNewObjectForEntityForName:@"Sale" inManagedObjectContext:self.context];
        sale.productName = [saleDictionary objectForKey:@"description"];
        sale.date = [formatter dateFromString:[saleDictionary objectForKey:@"occured_at"]];

        NSLog(@"Stored new sale in database.");
    }

    [self.context save:nil];
}

UIManagedDocumentの設定方法

@property (nonatomic, strong) UIManagedDocument *document;
@property (nonatomic, strong) NSManagedObjectContext *context;

...

NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"SalesBot Database"];
self.document = [[UIManagedDocument alloc] initWithFileURL:url];

if (![[NSFileManager defaultManager] fileExistsAtPath:[self.document.fileURL path]]) {
    [self.document saveToURL:self.document.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {}];
} else if (self.document.documentState == UIDocumentStateClosed) {
    [self.document openWithCompletionHandler:^(BOOL success) {}];
}

self.context = self.document.managedObjectContext;

更新1

NSNotificationCenterを使用してNSManagedObjectContextDidSaveNotificationを受信しようとしましたが、2回受信しています。[context save:nil]の直後に1回、5〜10秒後にもう一度!

4

3 に答える 3

3

したがって、上記のコアデータを使用しているようです。UIManagedDocumentこれはいくつかのことを説明しています。

最初に、を使用-[UIDocument saveToURL:forSaveOperation:completionHandler:]してドキュメントを保存します。ドキュメントから:

UIDocument通常、ドキュメントの保存には標準の方法を使用する必要があります。子コンテキストを直接保存する場合は、変更を親コンテキストにのみコミットし、ドキュメントストアにはコミットしません。親コンテキストを直接保存すると、ドキュメントが実行する他の重要な操作を回避できます。

UIManagedDocument2つの管理対象オブジェクトコンテキストで動作します。1つはメインスレッドで作業しており、もう1つはバックグラウンドスレッドでファイルへの変更を保存しています。これが変更が保存された理由ですが、再度開いた後は失われました。2番目のコンテキストは保存操作を終了しませんでした。

これは、通知が2回トリガーされた理由も説明しています。コンテキストごとに1つ。

于 2013-02-07T20:21:59.880 に答える
2

saveメソッドは非同期プロセスではありません。saveメソッドを呼び出した後に発生するものはすべて、保存後に実行されます。

NSLog(@"About to force a save...");
[context save:nil];
NSLog(@"Now I know the save is complete!");
于 2013-02-07T19:49:01.253 に答える
1

通知を確認できますNSManagedObjectContextDidSaveNotification

于 2013-02-07T19:55:23.423 に答える