1

NSManagedObject IBCompany単純な日付比較に基づいて、IBCompany の関係の 1 つである特定の期間を取得するカテゴリを my に追加しました。

次のコードを実行すると、NSArraysortedFinPeriodsDescには障害が発生した期間が正しい順序で格納されます。ただし、for eachループ内でそれらにアクセスすると、各ピリオドは属性に対して nil を返し、特に EndDate に対して nil を返します。このため、私のメソッドlastReportedPeriodforDateは常に nil を返します。これはエラーです。

#import "IBCompany+FinstatAccessors.h"

@implementation IBCompany (FinstatAccessors)

NSArray *sortedFinPeriodsDesc;

- (IBFinPeriod*)lastReportedPeriodforDate:(NSDate*)date;
{
    if ( !sortedFinPeriodsDesc ) {
        NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"EndDate" ascending:NO];
        sortedFinPeriodsDesc = [self.finperiod sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
        }   
    IBFinPeriod *lastPeriod;
    for (IBFinPeriod *finPeriod in sortedFinPeriodsDesc) {
        if ( [finPeriod.EndDate compare:date] == NSOrderedAscending ){ // finPeriod.EndDate < date
            lastPeriod = finPeriod;
            break;
        }
    }
    return lastPeriod;
}

ただし、メソッドの最初の行 (遅延インスタンス化) を削除してif clauseNSArray を常にインスタンス化し、並べ替えるsortedFinPeriodsDescと、コードは正常に機能します。

したがって、いくつか質問があります。

  • 私のコードのエラーは何ですか? 遅延インスタンス化の障害にどのように影響しますか?
  • NSArraysortedFinPeriodsDescを一時属性として定義し、awakeFromFetch代わりにソートすることをお勧めしますか?
  • あなたの考えでは、何が最良の選択肢でしょうか?

ご助力ありがとうございます!

4

1 に答える 1

1

「遅延読み込み」は、時期尚早の最適化のようです。特に実装した方法では、実際にはインスタンス変数を使用していませんが、グローバル変数 (詳細についてはこちらを参照) を使用しています。つまり、各オブジェクトは独自のバージョンの配列を保持していません。

配列をローカルにして、必要になるたびに生成することをお勧めします。これがパフォーマンスに影響する場合は、他の方法を検討できますが、上記の ivar 問題が解決されたとしても、期間セットが更新されると問題が発生します - 配列が古くなっています。

オブジェクトがこの期間に何回要求されているか、オブジェクトの数、または期間の数については言及していないため、より具体的なアドバイスを提供することは困難です。

フェッチされたプロパティは、期間を取得するより効率的な方法かもしれませんが、特定のケースで役立つ十分な経験がありません。

于 2012-07-24T12:24:05.050 に答える