1

これは、ストレージ クラスの init で使用したコードで、最近まで問題なく動作していました。テストしようとすると、addPersistentStoreWithType でクラッシュします (以下にマーク)。iPhone 5 に切り替えた後にこれに気付き、アプリを実行します...しかし、電話でiCloudをオフにするか、シミュレーターでテストしても問題はありません...

-(id)init
{
    self = [super init];
    if(self)
    {
        NSLog(@"%s", __FUNCTION__);
        favColors = [[NSMutableArray alloc] init];
        model = [NSManagedObjectModel mergedModelFromBundles:nil];
        NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
        NSString *path = [self itemArchivePath];
        NSURL *storeURL = [NSURL fileURLWithPath:path];
        NSError *error = nil;
        NSMutableDictionary *options = [NSMutableDictionary dictionary];

        NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
        if (ubiq) {
            NSLog(@"iCloud access at %@", ubiq);
            [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(contentChange:) name:NSPersistentStoreDidImportUbiquitousContentChangesNotification object:nil];
            NSFileManager *fm = [NSFileManager defaultManager];
            NSURL *ubcontainer = [fm URLForUbiquityContainerIdentifier:nil];
            [options setObject:@"color" forKey:NSPersistentStoreUbiquitousContentNameKey];
            [options setObject:ubcontainer forKey:NSPersistentStoreUbiquitousContentURLKey];

        } else {
            NSLog(@"No iCloud access");
        }
   // ************ Crash here **************
        if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:(ubiq?options:nil) error:&error]) {
            [NSException raise:@"Open failed" format:@"Reason: %@", [error localizedDescription]];
        }
        context = [[NSManagedObjectContext alloc] init];
        [context setPersistentStoreCoordinator:psc];
        [context setUndoManager:nil];

        [self loadAllItems];
    }
    return self;
}

- (NSString *)itemArchivePath
{
    NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentDirectory = [documentDirectories objectAtIndex:0];
    return [documentDirectory stringByAppendingPathComponent:@"store.data"];
}

また、アプリを一度実行し、クラッシュ後にicloudをオフにしてアプリを再度実行すると、icloudからデータが取得され、アプリに表示されます。

出力ログはこれを示しています。

file://localhost/private/var/mobile/Library/Mobile%20Documents/xxx での iCloud アクセス -PFUbiquitySetupAssistant performPreStoreSetupWithError:: CoreData: Ubiquity: ベースライン ファイルは存在しますが、読み取れませんでした

4

1 に答える 1

2

これは iCloud の内部エラーです。それはあなたのせいではありません。それを修正または防止するためにコードでできることは何もありません。それはランダムに発生し、いつ、どのような理由で予測可能なパターンもありません。残念ながら、アプリのデータを削除することが唯一の現実的な解決策です。これを行うと、iCloud のデータのコピーが削除されるだけで、アプリの Documents ディレクトリやその他の iCloud 以外の場所に保存されているデータは削除されないため、古いデータがまだ存在していても驚くことではありません。

于 2013-03-10T18:39:55.093 に答える