web-dev-qa-db-ja.com

CoreData:注釈:パスでの最適化モデルのロードに失敗しました(Xcode 11-> iOS 12)

IOS 12デバイスでXcode 11(ベータ3)を使用して(Xcode 10で作成された)Core Dataプロジェクトをビルドして実行すると、次の警告が表示されます。

CoreData:注釈:パス '/var/containers/Bundle/Application/7908B3F7-66BC-4931-A578-6A740CBFB37D/TestOMO.app/TestOMO.momd/TestOMO.omo'で最適化されたモデルを読み込めませんでした

次の場合、警告はありません。

  • IOS 12デバイスでXcode 10を使用してビルドして実行します
  • IOS 13デバイスでXcode 11を使用してビルドして実行します

私のアプリは問題なく動作しているようで、クラッシュはないので、この警告をどれほど深刻に受け止めるかわかりません。それでも私はきっとそれを取り除くことを好むでしょう。

このコアデータアノテーションに関連する投稿はたくさんありますが、ほとんどはGoogleマップに関連しているか、未回答です。

自分のプロジェクトに関連する問題の他の原因を排除し、次のように簡単に再現できるように、新しいプロジェクトを作成しました。

  1. Xcode 10を使用して新しいプロジェクトを作成(シングルビューアプリ、コアデータの使用)
  2. AppDelegate.Swiftで、print( "psc =(persistentContainer)")をfunc application(_、didFinishLaunchingWithOptions :)に追加します(遅延varの初期化を強制するだけです)
  3. IOS12デバイスでビルドして実行:問題なし
  4. Xcode 11で同じプロジェクトを開き、iOS13デバイスでビルドして実行します。問題はありません
  5. Xcode 11のシル、iOS12デバイスでビルドして実行:上記の警告が表示されます

ビルドフォルダーのクリーニングや派生データの削除は役に立ちません。

9
Lobo

上記の@ChaitanyaKhuranaのコメントのヒントのおかげで問題を解決することができました。

Swift私が実装したコードで、元の1行を置き換えます

let container = NSPersistentContainer(name: "ModelName")

新しいモデルバージョンが存在するたびにコードを更新する必要がないように、モデルバージョン文字列を(.momdパッケージにある.plistファイルから)取得するには、コードの一部が必要です。

また、iOS 13では問題がないため、新しい/代替コードは13.0より前のiOSバージョンでのみ実行されることにも注意してください。

let modelName = "ModelName"

var container: NSPersistentContainer!

if #available(iOS 13.0, *) {
    container = NSPersistentContainer(name: modelName)
} else {
    var modelURL = Bundle(for: type(of: self)).url(forResource: modelName, withExtension: "momd")!
    let versionInfoURL = modelURL.appendingPathComponent("VersionInfo.plist")
    if let versionInfoNSDictionary = NSDictionary(contentsOf: versionInfoURL),
        let version = versionInfoNSDictionary.object(forKey: "NSManagedObjectModel_CurrentVersionName") as? String {
        modelURL.appendPathComponent("\(version).mom")
        let managedObjectModel = NSManagedObjectModel(contentsOf: modelURL)
        container = NSPersistentContainer(name: modelName, managedObjectModel: managedObjectModel!)
    } else {
        //fall back solution; runs fine despite "Failed to load optimized model" warning
        container = NSPersistentContainer(name: modelName)
    }
}
2
Lobo