フェッチされたプロパティを数回使用しようとしましたが、これは正しいアプローチのようですが、決しては機能しません。
最近の試みでは、fetched-propertyをエンティティに追加し、モデル内の他のエンティティを「宛先」として選択し、述語を有効であることがわかっている条件に設定しました。
問題1:エンティティのNSManagedObjectクラスが生成されると、フェッチされたプロパティの何も含まれません。いくつか検索した後、.hファイルに宣言を追加し、.mファイルに@dynamicステートメントを追加しました(はい、NSArray *タイプであることがわかります)。
問題2:その後も、コードでこのプロパティにアクセスすると、フェッチ要求にエンティティがないことを示す例外がスローされます。 「エンティティ」は「宛先」として指定されたものであると想定しており、実際にはそこにあります。
そこで、フェッチされたプロパティがモデルで定義され、NSManagedObjectから派生したクラスで宣言され、実際にコードから使用される具体的な作業例(iOSプラットフォーム)を誰かに提供してもらいたいと思います。
この時点で、私はこの時間の浪費をあきらめ、フェッチ要求コードを自分で実装するだけです。
これが私の関連するコードのビットです(あなたがすでに言及したビットを含む):
私の例には、「Stats」オブジェクトと1->多くの関係がある「Card」オブジェクトがあります。各「Stats」オブジェクトには、1〜4の「結果」があります。フェッチされたプロパティは、「Card」オブジェクトに「outcome」= 1のみの「Stats」オブジェクトの配列を与える単純なプロパティです。
フェッチされたプロパティを使用して、特定の数と種類を超える「Stats」オブジェクトを持つ「Card」オブジェクトを簡単に取得できるようにしたかったのです。
そのため、「Card」オブジェクトに、Destinationを「Stats」に設定して、FetchedProperty「statsOfTypeOne」を配置しました。
このフェッチされたプロパティの述語に
(SELF.outcome=1) AND (SELF.card=$FETCH_SOURCE)
'SELF'は 'stats'レコードであり、$ FETCH_SOURCEは実行時に魔法のように 'Card'オブジェクトになります。
あなたがしたように、私は 'Card'オブジェクトの.hファイルと.mファイルに以下を入れました:
@property (nonatomic, retain) NSArray *statsOfTypeOne;
@dynamic statsOfTypeOne;
次に、私のコードで使用しました:
[self.managedObjectContext refreshObject:cardInstance mergeChanges:YES];
[cardInstance valueForKey:@"statsOfTypeOne"]
配列を取得します(ただし、cardInstance.statsOfTypeOneで問題ありません)。更新オブジェクトがないと、Fetchedプロパティは更新されませんでした(マニュアルによる)。
私考えるそれは私がそれを機能させるためにしたすべてです。それがあなたのために働くかどうか私に知らせてください。
ピーター
@Peterの答えに追加します。 Swift 2.0およびXcode7で動作させる方法は次のとおりです。
import Foundation
import CoreData
@objc(Card)
class Card: NSManagedObject {
@NSManaged var statsOfTypeOne: [Stat]
}
次に、フェッチされたプロパティを読み取るには:
managedObjectContext.refreshObject(someCard, mergeChanges: true)
// This works and returns [Stat] type
someCard.statsOfTypeOne
// So does this
someCard.valueForkey("statsOfTypeOne") as! [Stat]
この前の質問をご覧になりましたか: Xcode 4コアデータ:データモデルエディターで作成されたフェッチされたプロパティの使用方法
受け入れられた回答とすべてのコメントを読んでください。彼らはそれを整理したようです。