0

私は CoreData を使用しており、Book エンティティと ReadingSession エンティティがあります。各 Book には多くの ReadingSessions があります。

この計算されたプロパティを Book クラスに追加すると、機能します。

var sessions: [ReadingSession] {
    let request = NSFetchRequest(entityName: "ReadingSession")
    let predicate = NSPredicate(format: "book = %@", self)
    request.predicate = predicate
    return try! DataController.sharedInstance.managedObjectContext.executeFetchRequest(request) as! [ReadingSession]
}

しかし、これを追加すると、そうではありません:

var sessions: [ReadingSession] {
    return readingSession?.allObjects as! [ReadingSession]
}

この最後の例では、正しい配列が返されることもあれば、空の配列が返されることもあります。計算されたプロパティ内の他の関係で同じことを試しましたが、結果は同じです。

何故ですか?これを試してはいけない理由はありますか?私の最初の例は有効な回避策ですか、それとも後で問題が発生しますか? これに計算されたプロパティを使用することをあきらめて、必要なときにコードを繰り返す必要がありますか?

前もって感謝します!

ダニエル

4

1 に答える 1

1

ウェインがコメントで指摘したように、計算されたプロパティ内でリレーションシップを使用できるはずですが、私の問題は実際には別の場所にありました。

詳細に興味がある場合は、次の段落をお読みください。ただし、簡単に言えば、同じ問題を抱えている場合は、関係を調べて、To One または To Many として適切に設定されていることを確認する必要があります。また、必要な場合にのみ、すべてのプロパティを適切な場所に設定しているかどうかも確認してください。

質問を編集して多くの不要な詳細を削除し、読みやすくしましたが、最終的に問題は、ユーザーが行を選択したときに設定された selectedBook プロパティを持つ User エンティティがあったことです。To Many 関係として設定しましたが、ユーザーが一度に選択できる Book は 1 つだけなので、To One 関係にする必要がありました。また、本を作成したときに user.selectedBook を設定しましたが、selectedBook プロパティは、ユーザーが行から本を選択したときにのみ設定する必要があります。それで、私は自分の関係のいくつかを適切なタイミングで設定してアクセスしようとしていました. たとえば、ユーザーが行を選択する前に user.selectedBook にアクセスしようとすると、明らかに nil が返され、他の多くの計算されたプロパティが台無しになりました。今、私はそれをすべて修正しました。

于 2015-10-15T06:25:38.350 に答える