1

関連するコードのスニペットを次に示します。

NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    url = [url URLByAppendingPathComponent:@"Demo Document"];
    UIManagedDocument *document = [[UIManagedDocument alloc] initWithFileURL:url];    
if (document.documentState == UIDocumentStateClosed) {
            NSLog(@"file is closed");
            NSLog(@"%@",[url path]);
            NSDate *start = [NSDate date];
            [document openWithCompletionHandler:^(BOOL success) {
                if (success) {
                    NSLog(@"finished OPEN");
                    NSDate *methodFinish = [NSDate date];
                    NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:start];
                    NSLog(@"time = %f",executionTime);
                    self.managedObjectContext = document.managedObjectContext;
                }
            }];
        }

「ファイルが閉じられた」から「開いた」までの時間間隔は 16.6 秒でした。これは正常な動作ですか?コーディングが悪い?それとも、シミュレーターで実行しているからですか?

それが問題になるかどうかはわかりませんが、ファイルはわずか50KBです...

4

2 に答える 2

0

信じられないかもしれませんが、これは正常です。実際にはコードとは関係ありませんが、多かれ少なかれ、autosave. この自動保存動作は、実際にはデフォルトでオン/有効になっています(オフにすることもできますが、必要がなく、何をしているのかを知っている場合を除き、そうしないことを強くお勧めします)。

とにかく、UIManagedDocument実際には、デフォルトでバックグラウンドでデータをドキュメントストアに自動的に保存しますが、これに対する注意点は、可能な場合はいつでも(または、必要な場合はいつでも)実行することです。心配する必要がないように、バックグラウンドでこれを行うことを理解してください(これは私が本当に気に入っている機能ですが、彼のお尻の痛みにもなり得ます)。

データが表示されていないか、期待する結果が表示されていないため、保存する必要があるようです。

その場合は、コントローラーに表示されるように、実際に変更を保存する方法を詳しく調べる必要があると思います。実際には、UIManagedDocument が保存されるタイミングとはほとんど関係がなく、コンテキストが更新されるタイミングとは関係ありません。これが実際に当てはまる場合、この同じ件名に関する別のスレッド/質問に対する私の回答が役立つかもしれません: Multiple UIManagedDocument For Read & Write

これはあなたが求めているものかもしれませんし、そうでないかもしれませんが、少なくとも正しい道を歩むことができると信じています.

于 2014-07-21T04:23:57.237 に答える
0

これは正常な動作ではありません。「デバッグ-> iCloud-> iCloudコンテンツの削除」でXcode 5を使用してすべてのiCloudデータをクリアしようとしましたか? 完全に理解するには数分かかりますが、白紙の状態から始めると役立つ場合があります。

すでにこれを行っている場合は、一時的に保持されているドキュメントで他に何が作業されているかを調べましたか? または、何か他のものがメイン スレッドをブロックしていますか? そのブロックは、メイン スレッドのイベント キューが戻ってくるまで実行されないためです。

于 2013-09-06T02:00:12.937 に答える