2017-09-17 7 views
0

現在、いくつかのターゲットを使用する迅速なプロジェクト4を作成中です。すべてのターゲットは同じコアデータにアクセスする必要があるため、データモデルとそのア​​クセス情報を格納する独自のフレームワークターゲットを作成することに決めました。複数のターゲットを持つコアデータフレーム

私が午前問題は、私はアプリケーションを実行すると、私は次のエラーを取得する、私のアプリケーションのターゲット(CoreDataTest)である:

2017-09-17 12:02:20.787132+0100 CoreDataTest[22070:3218298] [error] error: Failed to load model named TestData 
CoreData: error: Failed to load model named TestData 
2017-09-17 12:02:20.787594+0100 CoreDataTest[22070:3218298] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'An NSManagedObject of class 'Message' must have a valid NSEntityDescription.' 
*** First throw call stack: 
(0x182097d38 0x1815ac528 0x18481a73c 0x1026c6678 0x1026c6708 0x1848bac5c 0x10261d480 0x10261ce94 0x10261cd48 0x10261cecc 0x18b42b96c 0x18b42b544 0x18bc 0x18b42f378 0x18b49edb4 0x18b68e570 0x18b693300 0x18b9129b4 0x18bbd90d0 0x18b912618 0x18b912e88 0x18c05daf4 0x18c05d998 0x18bde7ab4 0x18bf77c94 0x18bde7964 0x18bbd8730 0x18b691a44 0x18ba80144 0x18472d968 0x184736270 0x10344145c 0x10344db74 0x184761b04 0x1847617a8 0x184761d44 0x182040358 0x1820402d8 0x18203fb60 0x18203d738 0x181f5e2d8 0x183de3f84 0x18b48f5e0 0x10261deec 0x181a8256c) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

私は例外ブレークポイントを追加し、それがPersistenceStorage.saveContext()ViewController.swiftでクラッシュ。

1つのプロジェクトで複数のターゲットに共有コアデータデータベースを作成するためのフレームワークを作成するにはどうすればよいですか?

私のプロジェクトの設定です。各グループはそれぞれ独自のターゲットであることに注意してください。

enter image description here

ターゲット:CoreDataKit(フレームワーク)
CoreData.swift

import CoreData 

public class PersistenceStorage { 

    private init() {} 

    public static var context: NSManagedObjectContext { 
     return persistentContainer.viewContext 
    } 


    public static var persistentContainer: NSPersistentContainer = { 
     let container = NSPersistentContainer(name: "TestData") 
     container.loadPersistentStores(completionHandler: { (storeDescription, error) in 
      if let error = error as NSError? { 
       fatalError("Unresolved error \(error), \(error.userInfo)") 
      } 
     }) 
     return container 
    }() 


    public static func saveContext() { 
     let context = persistentContainer.viewContext 
     if context.hasChanges { 
      do { 
       try context.save() 
      } catch { 
       let nserror = error as NSError 
       fatalError("Unresolved error \(nserror), \(nserror.userInfo)") 
      } 
     } 
    } 
} 

メッセージ+ CoreDataClass.swift

import Foundation 
import CoreData 

@objc(Message) 
public class Message: NSManagedObject { 

} 

メッセージ+ CoreDataProperties.swift

import Foundation 
import CoreData 


extension Message { 

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Message> { 
     return NSFetchRequest<Message>(entityName: "Message") 
    } 

    @NSManaged public var text: String? 

} 

対象:CoreDataTest(主な用途)
ViewController.swift

import UIKit 
import CoreDataKit 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let message = Message(context: PersistenceStorage.context) 
     message.text = "test" 
     PersistenceStorage.saveContext() 

    } 
} 

AppDelegate.swift

import UIKit 
import CoreData 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     // Override point for customization after application launch. 
     return true 
    } 

} 

答えて

1

研究と試行錯誤の多くの後、私は私が設定する必要がありますことを発見xcdatamodelファイルのターゲットメンバーを共有したい他のターゲットに追加します。ただ、このぶつかった

enter image description here

0

自分はので、私はカップル他のオプションを投稿しようと思いました。

NSPersistentContainerをサブクラス化していないので、バンドルを探す場所がわからないので、オプションがなく、メインバンドルを調べます。

フレームワークでモデルを使用する場合は、NSPersistentContainerをサブクラス化するか、モデルを最初にロードして永続コンテナの初期化に渡すことができます。単一のモデルしか持っていない場合は、mergedModelFromBundlesのような処理を行うのが簡単です。そのモデルを永続コンテナ初期化子に渡します。

関連する問題