UIManagedDocument にはさらにヘルプがあり、UIDocument のサブクラスであるため、UIDocument と UIManagedDocument についてここでできることはすべて読んできましたが、これについて何をする必要があるかわかりませんでした。
ユーザーが新しいドキュメントを作成するためにアプリの追加ボタンを押すと、ドキュメントを作成し、いくつかのアイテムを事前入力する必要があります。これを実行するためのコードは、デバッガーを 1 ステップ実行している限り問題なく動作しますが、全速力で実行すると、いくつかの項目がドキュメントに表示されません。
ドキュメントへの参照を AppDelegate に保存し、コードを簡単に読み取れるようにマクロを定義します。
#define SelectedDocument [(AppDelegate *)[[UIApplication sharedApplication] delegate] selectedDocument]
したがって、追加リクエストを処理する際に、私のコードはこれを行います:
GnKDocument *tmp = [[GnKDocument alloc] initWithFileURL:fileURL];
[(AppDelegate *)[[UIApplication sharedApplication] delegate] setSelectedDocument:tmp];
[SelectedDocument saveToURL:fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
if (success) {
[SelectedDocument openWithCompletionHandler:^(BOOL success) {
if (success) {
[SelectedDocument setDateCreated:[NSDate date]];
NSString *c1UUID = [SelectedDocument appendChapterWithName:@"Chapter 1"
withColor:kChapterColorYellow];
NSString *p1c1UUID = [SelectedDocument appendPageWithParent:c1UUID
withName:@"Page 1"
withColor:kPageColorRed];
NSLog(@"Just added Page 1 as %@ to chapter %@", p1c1UUID, c1UUID);
[SelectedDocument closeWithCompletionHandler:^(BOOL success) {
}];
}
}
}];
私の UIDocument サブクラスへの 2 つの追加呼び出しは、それぞれの作業を行ってから呼び出します
[self updateChangeCount:UIDocumentChangeDone];
そして、テストのステップとして、変更が行われていることをログアウトするためだけにそのメソッドをオーバーライドしました。
- (void)updateChangeCount:(UIDocumentChangeKind)change
{
[super updateChangeCount:change];
NSLog(@"GnKDocument recording a change");
}
私は正しい順序で物事を行っていますか?コールをさまざまなキューにディスパッチする必要がありますか?
- インスタンスを初期化する
- 作成するために保存します
- それを開きます(最初のアイテムを追加するため)
- 追加する
- それを閉じます(ドキュメントによると、 closeWithCompletionHandler: 非同期に変更を保存します)。
繰り返しますが、各呼び出し (saveToURL:、openWithCompletionHandler:、および closeWithCompletionHandler) にブレークポイントを設定し、それらの呼び出しを「ステップ オーバー」してから実行して完了ハンドラーに入る場合、ドキュメントは意図したとおりにディスクに配置されます。ブレークポイントを無効にして再度実行すると、ディスク上にドキュメントが作成され、変更がログに記録されますが、閉じたファイルには最初の 2 つの要素が含まれていません。