2

フェッチリクエストを実行する必要があります。しかし、それを実行すると、障害は発生しませんNSManagedObject(各オブジェクトは約5 Mbであるため、メモリ警告が表示されます)。Appleは、Core Dataに障害が発生する可能性を提供しています(オブジェクトがRAMにロードされていない場合)そして、私は自分のオブジェクトにこの可能性を利用させたいと思っています。

これが私のコードです

+ (NSMutableSet *)GetImagesWithPredicate:(NSPredicate *)predicate
{
    NSString *entityName = kEntityName;
    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];;
    NSManagedObjectContext *context = appDelegate.managedObjectContext;
    NSEntityDescription *entityDesctiption = [NSEntityDescription 
                                              entityForName: entityName
                                              inManagedObjectContext:context];

    // find object
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDesctiption];
    [request setPredicate:predicate];
    NSArray *objects = [context executeFetchRequest:request error:nil];
    [request release];
    if (objects == nil)
    {
        NSLog(@"there was an error");
        return nil;
    }
    NSMutableSet *set = [NSMutableSet setWithArray:objects];
    return set;
}

ここで、述語は(id < 500)です。

後にアプリがクラッシュする

NSArray *objects = [context executeFetchRequest:request error:nil];

オブジェクトのすべてのデータがiPhoneのRAMに表示されるためです。

デフォルトのオプションreturnsObjectsAsFaults = YESが機能しないようです。

4

2 に答える 2

3

オブジェクトはおそらく障害として返されています。これは。で確認できますisFault。問題は、Core Dataがそれらのオブジェクトのプロパティ値を自動的にプリフェッチし、それらを行キャッシュ(メモリ内)に配置することです。includesPropertyValuesオブジェクトをに設定するNOと、この動作を無効にできNSFetchRequestます。

これらすべての詳細とパフォーマンスへの影響については、includesPropertyValuesのドキュメントを参照してください。

余談ですが、データベースに大量の大きなオブジェクトを直接保存したくない場合があります。iOS 5をターゲットにしている場合は、外部ストレージの使用を検討する必要があります。そうでない場合は、CoreDataで名前/パス/IDを使用して別のファイルを自分で使用する必要があります。

于 2012-06-06T13:58:48.093 に答える
2

を設定- (void)setResultType:(NSFetchRequestResultType)typeし、メソッドNSFetchRequestを使用してオブジェクトに関連する属性のみを取得できます。-(void)setPropertiesToFetch:(NSArray *)values

そして、必要な属性を遅延ロードするだけです。

于 2012-06-06T13:38:05.227 に答える