0

スタンフォード大学の CoreDataTableViewController を使用して動的テーブルを表示しています。

アプリの仕組み: このテーブルに行を追加するために、データ入力のために子画面がポップされます。子画面が閉じると、新しく作成された managedObject が挿入され、コールバックによってテーブルがリロードされます。

画面に再び入ると、新しく追加された行が断続的にテーブルから欠落していることに気付きました。この動作は、UIManagedDocument オブジェクトが saveToURL を使用して初めて作成されたときにのみ発生することに気付きました。その後、アプリを再起動し、openWithCompletionHandler を使用して UIManagedDocument を開くと、リストは常に正しく表示されます。

UIManagedDocument を作成/開くために使用しているコードは次のとおりです。

- (void)performWithDocument:(OnDocumentReady)onDocumentReady
{
    void (^OnDocumentDidLoad)(BOOL) = ^(BOOL success)
    {
        NSLog(@"Called OnDocumentDidLoad");
        onDocumentReady(self.document);
    };

    if (![[NSFileManager defaultManager] fileExistsAtPath:[self.document.fileURL path]])
    {
        [self.document saveToURL:self.document.fileURL
                forSaveOperation:UIDocumentSaveForCreating
               completionHandler:OnDocumentDidLoad];
    }
    else if (self.document.documentState == UIDocumentStateClosed)
    {
        NSLog(@"Calling openWithCompletionHandler:OnDocumentDidLoad");
        [self.document openWithCompletionHandler:OnDocumentDidLoad];
    }
    else if (self.document.documentState == UIDocumentStateNormal)
    {
        OnDocumentDidLoad(YES);
    }
}

上記のコードを実行すると、常に onDocumentDidLoad() が呼び出され、成功フラグは YES になります。

どんな助けでも大歓迎です。前もって感謝します!

-- 次のコードを編集して、Jody に応答してドキュメントを作成し、閉じてから再度開く方法を示しました - それでも同じ問題が発生しました。---

- (void)performWithDocument:(OnDocumentReady)onDocumentReady
{
    void (^OnDocumentDidLoad)(BOOL) = ^(BOOL success)
    {
        NSLog(@"Called OnDocumentDidLoad success: %d", success);
        onDocumentReady(self.document);
    };

    void (^OnDocumentDidClose)(BOOL) = ^(BOOL success)
    {
        NSLog(@"Called OnDocumentDidClose, openWithCompletionHandler success: %d", success);
        [self.document openWithCompletionHandler:OnDocumentDidLoad];
    };

    void (^OnDocumentDidSave)(BOOL) = ^(BOOL success)
    {
        NSLog(@"Called OnDocumentDidSave success: %d", success);
        if (self.document.documentState == UIDocumentStateClosed)
        {
            NSLog(@"Calling openWithCompletionHandler:OnDocumentDidLoad from onDocumentDidSave - was closed");
            [self.document openWithCompletionHandler:OnDocumentDidLoad];
        }
        else if (self.document.documentState == UIDocumentStateNormal)
        {
            // TODO Close and reopen?
            NSLog(@"Calling closeWithCompletionHandler:OnDocumentDidClose from onDocumentDidSave - was normal");

            [self.document closeWithCompletionHandler:OnDocumentDidClose];
        }
    };

    if (![[NSFileManager defaultManager] fileExistsAtPath:[self.document.fileURL path]])
    {
        // Database doesn't exist, create it, then close and reopen in completion handler
        [self.document saveToURL:self.document.fileURL
                forSaveOperation:UIDocumentSaveForCreating
               completionHandler:OnDocumentDidSave];
    }
    else if (self.document.documentState == UIDocumentStateClosed)
    {
        // Open existing database
        NSLog(@"Calling openWithCompletionHandler:OnDocumentDidLoad");
        [self.document openWithCompletionHandler:OnDocumentDidLoad];
    }
    else if (self.document.documentState == UIDocumentStateNormal)
    {
        // Already opened
        OnDocumentDidLoad(YES);
    }
}
4

1 に答える 1