電話をすると気づきました
[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秒後にもう一度!