0

コードは、スタンフォードiOS開発コースのPhotomaniaアプリからのものです。基本的に、Photoエンティティのインスタンスが実際にメモリ(またはコンテキスト)にフェッチされるタイミングを知りたいです。ここで定義されたファクトリメソッドがテーブルビューコントローラで呼び出されたときに発生しますか?

@interface Photo (Flickr)
+ (Photo *)photoWithFlickrInfo:(NSDictionary *)flickrInfo
        inManagedObjectContext:(NSManagedObjectContext *)context;
@end


@implementation Photo (Flickr)
+ (Photo *)photoWithFlickrInfo:(NSDictionary *)flickrInfo
        inManagedObjectContext:(NSManagedObjectContext *)context
{
    Photo *photo = nil;

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Photo"];
    request.predicate = [NSPredicate predicateWithFormat:@"unique = %@", [flickrInfo objectForKey:FLICKR_PHOTO_ID]];
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES];
    request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

    NSError *error = nil;

    NSArray *matches = [context executeFetchRequest:request error:&error];

    if (!matches || ([matches count] > 1)) {
        // handle error
    } else if ([matches count] == 0) {
        photo = [NSEntityDescription insertNewObjectForEntityForName:@"Photo" inManagedObjectContext:context];
        photo.unique = [flickrInfo objectForKey:FLICKR_PHOTO_ID];
        photo.title = [flickrInfo objectForKey:FLICKR_PHOTO_TITLE];
        photo.subtitle = [flickrInfo valueForKeyPath:FLICKR_PHOTO_DESCRIPTION];
        photo.imageURL = [[FlickrFetcher urlForPhoto:flickrInfo format:FlickrPhotoFormatLarge] absoluteString];
        photo.whoTook = [Photographer photographerWithName:[flickrInfo objectForKey:FLICKR_PHOTO_OWNER] inManagedObjectContext:context];
    } else {
        photo = [matches lastObject];
    }

    return photo;
}

@end
4

2 に答える 2

0

このメソッドを呼び出すと、写真がメモリに読み込まれます。CoreDataはおそらく、後続のフェッチがストレージバックエンドに移動する必要がないようにキャッシュを実行しますが、これは間違いなく魔法が発生する場所です。

CoreDataについてもっと読む必要があります。これは巨大なフレームワークですが、それをしっかりと理解することで、Cocoaアプリ用の効率的で賢明なストレージソリューションを設計するのに長い道のりが必要になります。

于 2012-08-02T01:23:27.450 に答える
0

これは、「データベース」の「写真の作成」または「写真の挿入」メソッドの一種です。したがって、FlickrFetcherクラスが出て写真を取得すると、取得するすべての写真に対してこのメ​​ソッドが呼び出されます。

このメソッドは、最初に写真がコアデータデータベースに存在するかどうかを確認し、存在しない場合は追加して、管理対象オブジェクトのコンテキストを保存します。

したがって、技術的には、Photoオブジェクトは[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]メソッドを使用してメモリ内に作成されます。

于 2012-08-02T02:07:34.737 に答える