2012-08-02 3 views
0

코드는 Stanford 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 

답변

0

이 방법을 호출하면 사진이 메모리에로드됩니다. CoreData는 아마도 후속 페치가 스토리지 백엔드로 갈 필요가 없도록 일부 캐싱을 수행 할 것입니다. 그러나 이것은 확실히 마술이 일어나는 곳입니다.

CoreData에 대한 자세한 내용을 읽어야합니다. 거대한 프레임 워크이지만 Cocoa 앱을위한 효율적이고 합리적인 스토리지 솔루션을 설계하는 데는 많은 도움이됩니다.

0

이것은 "데이터베이스 만들기"의 "사진 만들기"또는 "사진 삽입"방법 중 하나입니다. 따라서 FlickrFetcher 클래스가 나가서 사진을 검색하면이 메소드를 검색하는 모든 사진에 대해이 메소드가 호출됩니다.

이 방법은 먼저 사진이 핵심 데이터베이스에 있는지 확인하고 추가하지 않으면 관리 대상 개체 컨텍스트를 저장합니다.

기술적으로 사진 개체는 [NSEntityDescription insertNewObjectForEntityForName : inManagedObjectContext :] 메서드를 사용하여 메모리에 만들어집니다.