3

私が取り組んでいるプロジェクトでは、複数の永続ストアがあり、フェッチされたプロパティがエンティティで定義され、さまざまなストアに存在するオブジェクトへのアクセスを提供します。

Editor->を実行するCreate NSManagedObject Subclassと、フェッチされたプロパティはサブクラスに入力されないため、このエンティティを使用する別のコントローラーではアクセスできません。

私の好奇心は、これらのオブジェクトを使用できるようにサブクラスで定義する方法です。

たとえば、下に「Some Object」というオブジェクトがあり、このオブジェクトに「imageFile」というフェッチされたプロパティがあるとします (File オブジェクトは別のストアにあるため、直接参照することはできません)。

class SomeObject: NSManagedObject {

   @NSManaged var name: String
   @NSManaged var id: String
   @NSManaged var imageID: String
   @NSManaged var imageFile: File             //Not generated automatically like the rest
}

残念ながら、上記の試みは次のエラーで失敗します。

インスタンス 0x60800865de50 に送信された認識されないセレクター

私の質問は一言で言えば、取得したプロパティにどのようにアクセスするのか、またはそれらを参照するための構文は何かということです。

「フェッチされたプロパティを使用しないでください」または「永続ストアを 1 つだけ使用してください」という回答はしないでください。通常のリレーションシップの使用方法は既に知っているので、Core Data のこの機能を活用する方法を知りたいです。前もって感謝します!

アップデート

以下に投稿された解決策のいくつかを試してみると、役に立つかもしれない興味深い情報に出くわしました。「po someObject」を使用してオブジェクトを出力したところ、出力の data 属性の下に次のように表示されて驚きました。

imageFile = "<relationship fault: 0x618000043930 'imageFile'>";
imageID = "some Id"

ただし、someObject.imageFile を使用して imageFile にアクセスしようとすると、アクセスできません。valueForKey["imageID"] を使用して参照を取得できますが、File へのキャストで毎回失敗します。オブジェクトを印刷すると、次のようになります。

Optional(Relationship fault for (<NSFetchedPropertyDescription: 0x6180000e1780>), name imageFile, isOptional 1, isTransient 1, entity SomeObject...

最終更新

これにより、valueForKey["imageID"]フォールトがトリガーされ、プロパティがフェッチされます。ファイルで属性が反転していたため、最初は属性xcdatamodelidが見つかりませんでした。

4

2 に答える 2

3

@dynamicObjective-Cでは、上のカテゴリでプロパティ ファイルを定義できますSomeObjectが、Swift には同様のものはありません (私の知る限り)。

そのため、キーと値のコーディングを使用してフェッチされたプロパティ (常に配列として表される) を取得することが唯一の方法です。

if let files = yourObject.valueForKey("imageFile") as? [File] {
    // ...
}

もちろん、@gutenmorgenuhuの回答で提案されているように、これを計算されたプロパティにラップできます。

于 2015-05-09T21:09:05.017 に答える
2

これを NSManagedObject と同じクラスに追加する場合は、拡張機能を使用できます。

extension SomeObject{
  var imageFile: String {
    get {// Code to return your fetchedProperty
    }
  }
}
于 2015-05-09T20:33:54.077 に答える