Core Data によって管理され、iPhone アプリで iCloud と同期されているデータベースを使用しようとしています。
WWDC 2012 のサンプル コードを使用したところ、ほぼ正常に動作しました。
また、私のデータベースは非常に単純です。オブジェクトは 1 種類しかなく、関係はありません。
2 つのデバイスは iCloud を介して通信できますが、この小さなシナリオは失敗します。
- デバイス A にオブジェクトを作成する
- オブジェクトがデバイス B に表示されるのを待ちます
- デバイス A 上のオブジェクトを変更します
- デバイス B のオブジェクトを変更します
- デバイス B が更新を認識すると、変更をマージしようとし、アプリがクラッシュします。
はい、アプリがクラッシュします。私のデータベースには 1 つのオブジェクトしかなく、Core Data は小さな衝突を解決できないようです。
永続ストアを作成する方法とオプションは次のとおりです。
NSDictionary *options = @{NSPersistentStoreUbiquitousContentNameKey : contentName,
NSPersistentStoreUbiquitousContentURLKey : iCloudLogsPath};
self.iCloudStore = [self.persistentStoreCoordinator
addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:iCloudData
options:options
error:&error];
バックグラウンドで NSManagedObjectContext を作成するために使用するコードは次のとおりです。
- (NSManagedObjectContext*) currentThreadContext {
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[moc setPersistentStoreCoordinator:self.persistentStoreCoordinator];
[moc setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy];
return moc;
}
例外をキャッチするためにブレークポイントを追加しました。これが得られるものです。
objc_exception_throw:
[NSPersistentStoreCoordinator executeRequest:withContext:error:]:
[NSManagedObjectContext save:]:
[_PFUbiquityRecordImportOperation main]:
[__NSOperationInternal start]:
[_PFUbiquityRecordsImporter scheduleTransactionLogOperations:synchronous:error:]:
[_PFUbiquityRecordsImporter scanOperationFinished:withDiscoveredLogLocation:error:]:
[PFUbiquityImportScanOperation main]:
[__NSOperationInternal start]:
[_PFUbiquityRecordsImporter scheduleUbiquityRootScan:withLocalPeerLogs:error:]:
[_PFUbiquityRecordsImporter rollResponseOperation:successfullyAdoptedBaseline:]:
[PFUbiquityBaselineRollResponseOperation main]:
[__NSOperationInternal start]:
どんな助けでも大歓迎です!