0

私は関係を持つ2つのエンティティを持っています。1 つの親子 (複数に対して)。初めて取得しても大丈夫です。フェッチ要求が 2 回目に呼び出されると、親への参照キーが削除/null になり、子レコードが孤立します。

- (void)prepareGallery
{
    self.events = [[NSMutableArray alloc] init];
    self.photos = [[NSMutableArray alloc] init];

    NSArray *tempArr = [self fetchEntity:@"PEvent" predicate:nil];

    for (Event *pEvent in tempArr) {
        NSSet *photoSet = [pEvent photos];

        NSArray *photosArray = [photoSet allObjects];


        if ([photosArray count] > 0) {
            //only add events with photos
           [self.events addObject:pEvent];
           [self.photos addObject:photosArray];
        }

    }

    if ([self.events count] > 0) {
        [collectionView reloadData];
    }else{
        NSLog(@"Events empty");
    }
}

-(NSArray*)fetchEntity:(NSString*) entityName predicate:(NSPredicate*) predicate
{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];

request.resultType = NSManagedObjectResultType;

if (predicate != nil) {
    request.predicate = predicate;
}

NSError *error;
NSArray *result = [_managedObjectContext executeFetchRequest:request error:&error];

return result;
}

モデル関係

エンティティ: 写真
送信先: PEvent
逆: 写真
削除ルール: アクションなし
タイプ: 1 つに

エンティティ: PEvent
デスティネーション: 写真
インバース: pEvent
削除ルール: カスケード
タイプ: To many

4

1 に答える 1

0

いくつかの問題。アレイの設定が最適ではありません。イベントと写真で 2 つの別々の配列を作成することで、関係が壊れています

ここで重要なのは、これらのアーティファクトを完全になくすことです。NSFetchedResultsController必要に応じて、すべてのイベントを取得して配列に保持することもできますが、もちろん、オブジェクトを提供するために a を使用する方がはるかに堅牢です。

配列を使用する場合、必要なのはイベント配列だけです。コレクション ビューのデータソースで、イベントの写真の数が必要な場合は、簡単event.photos.countです。

セットアップ ルーチンで完全に不要な操作を実行しています。

たとえば、すべてのイベントをフェッチしますが、それらをループで新しい配列にフィルター処理します。フェッチリクエストで述語を使用するだけです。

また、写真NSSetを配列 (ランダムな順序になります) に変換しますが、これも不要です。写真を順番に並べる必要がある場合は、タイムスタンプのようなものが最も適切と思われます。

于 2013-11-07T08:31:15.683 に答える