0

代码来自斯坦福 iOS 开发课程的 Photomania 应用程序。基本上我想知道照片实体的实例何时被实际提取到内存(或上下文)中。在表视图控制器中调用此处定义的工厂方法时会发生这种情况吗?

@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

这是一种用于“数据库”的“创建照片”或“插入照片”方法。因此,当 FlickrFetcher 类出去并检索照片时,对于它检索到的每张照片,都会调用此方法。

该方法首先检查照片是否存在于核心数据库中,如果不存在则添加,并保存托管对象上下文。

因此,从技术上讲,Photo 对象是使用 [NSEntityDescription insertNewObjectForEntityForName: inManagedObjectContext:] 方法在内存中创建的。

于 2012-08-02T02:07:34.737 回答
0

调用此方法时,照片会加载到内存中。CoreData 可能会进行一些缓存,这样后续的获取就不必进入存储后端,但这绝对是神奇的地方。

您应该阅读更多有关 CoreData 的内容。它是一个庞大的框架,但对它的深入了解将让你在为 Cocoa 应用程序设计高效且合理的存储解决方案方面走得很远。

于 2012-08-02T01:23:27.450 回答