1

OSX 10.6でXCode 4.2を使用して、iOS 5.0でUIManagedDocumentを使用し、シミュレーターでアプリを実行しています。問題のコードは次のようになります。

if (![[NSFileManager defaultManager] fileExistsAtPath:[self.photoDatabase.fileURL path]]) {
    // does not exist on disk, so create it
    [self.photoDatabase saveToURL:self.photoDatabase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
        [self setupFetchedResultsController];
        [self fetchFlickrDataIntoDocument:self.photoDatabase];

    }];
} else if (self.photoDatabase.documentState == UIDocumentStateClosed) {
    // exists on disk, but we need to open it
    // *** the following line generates the message ***
    [self.photoDatabase openWithCompletionHandler:^(BOOL success) {
        //[self setupFetchedResultsController];
        }];
} else if (self.photoDatabase.documentState == UIDocumentStateNormal) {
    // already open and ready to use
    [self setupFetchedResultsController];
}

マークされた行を実行すると、ログに次のメッセージが作成されます。

2012-01-10 22:33:17.109 Photomania[5149:4803] NSFileCoordinator: A surprising server error was signaled. Details: Connection invalid

メッセージが送信された後、UIManagedDocument が機能する場合と機能しない場合があります。これを決定する状況はまだわかりません。

実際にはスタンフォード大学の CS193p コースのコード例の 1 つであるため、このコードが正しいと確信しています。サンプル全体は、 http: //www.stanford.edu/class/cs193p/cgi-bin/drupal/ の下の Web サイトでダウンロードできます 。 コードへの直接リンク: http://www.stanford.edu/class/cs193p/ cgi-bin/drupal/system/files/sample_code/Photomania_0.zip

さらに、コードは「驚くべき」メッセージを生成せずにデバイス自体で正常に実行され、その後のすべてのコードが正常に実行されます。

Google でも Apple Developer ページでも何も見つかりませんでした。シミュレータまたは XCode を再起動するか、両方を再インストールしても、動作は変わりません。

何か案は?

4

5 に答える 5

1

私はこれを何度か経験したとしか言えません。私にとって、dataModel を更新した後は怠け者でした。これまでのところ、このエラーが発生するたびに、データ モデルを変更したことが原因でした。通常、シミュレーターからアプリを削除して再実行するだけで、常に問題なく動作します。これが誰かを助けることを願っています。

于 2012-03-01T18:19:31.297 に答える
1

私は答えを見つけたと思います。UIManagedDocument の自動保存は、シミュレーターで数秒後に開始されるようです。

そのため、ホームボタンを押してシミュレーターでアプリを最小化し、アイコンをクリックして再度最大化しました。そして、シミュレーターでアプリを終了しました。

アプリを再起動すると、データベースが読み込まれました。エラーは引き続き表示されます-ドキュメントが「閉じられた」状態にあるために発生します(これは正常です-CS193PがopenWithCompletionHandlerを呼び出すように要求した理由です)が、起動後のデータは保持されます. 残念ながら、アプリを終了する前に最小化/最大化ルーチンを実行する必要があります。そうしないと、次回の起動時に変更が破棄されます。

これが再現できる動作であることを確認できますか? 少なくともテストの目的では、これは使用するのに十分なトリックです。

于 2012-03-06T21:54:14.380 に答える
0

最新のiOS5.1にアップグレードしてみてください。iCloudを使ったUIManagedDocumentが5.0で確実に機能するとは思わない。これが私の経験です。

于 2012-02-19T06:42:12.267 に答える
0

スタンフォード大学の iTunes クラスが大好きです。ただし、UIManagedDocument を使用するためのサンプル コードは間違っていると思います。実際、彼はデモの中で、その時点で情報を取得したいので、そのようにしているだけだと述べています。コードのコメントで、彼は、アプリが終了するとデータが保存されないため、自動保存機能を使用しないと述べています。ただし、UIManagedDocument、終了する前に必要なものをすべて保存します。データが確実に保存されるように、終了/マルチタスクなどに関連するすべてのハンドラーがあります。

したがって、そのコードを例として使用している場合、動作するはずのバージョンがあり、saveToURL を使用しません (私は flickr アカウントを持っていないため、実際には実行しませんでしたが、クラスは次のようになります。動作するように設計されています)。うまくいかない場合はお知らせください。

- (void)fetchFlickrDataIntoDocument:(UIManagedDocument *)document
{
    NSManagedObjectContext *ctx = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSPrivateQueueConcurrencyType];
    ctx.parentContext = document.managedObjectContext;
    [ctx performBlock:^{
        NSArray *photos = [FlickrFetcher recentGeoreferencedPhotos];
        for (NSDictionary *flickrInfo in photos) {
            [Photo photoWithFlickrInfo:flickrInfo inManagedObjectContext:ctx];
            // Push changes to document MOC
            [ctx save:0]; // propagates changes to parent MOC
            // and tell the document it is dirty and needs to be saved
            // It will be saved when the document decides its time to save
            // but it *will* be saved.
            [document updateChangeCount:UIDocumentChangeDone]
        }
    }];
}
于 2012-04-17T23:31:33.477 に答える
0

ドキュメント ファイルの URL の最後のパス コンポーネントが @"Database" の場合に、まだエラーが発生していました。拡張子 @"Database.db" を追加すると修正されたようで、現在はすべて正常に動作しています。ただし、Lionにもアップグレードしました。

NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"Database.db"];  
于 2012-05-10T15:32:44.107 に答える