这篇文章是针对斯坦福iOS7 2013-1014的公开课Assignment 6 Top Regions所进行的解答的第八部分。
4.All of your table views everywhere in your application (including the Recents tab) must be driven by Core Data (i.e. not NSUserDefaults nor Flickr dictionaries). You no longer have to support “pulling down to refresh” (though see Extra Credit 1).
本节主要是完成Recents表的显示。
创建Recent的category名为Photo,并在public api中定义一个方法:
+ (Recent *)recentPhoto:(Photo *)photo;
当调用这个方法时,检查这个图片是否已经添加过了。如果是的话,更新时间戳就OK了;否则,设置新的图片和时间戳。并且我们查询图片是否超过20张,如果超过那么删掉最后一张。
#define RECENT_PHOTOS_MAX_NUMBER 20
+(Recent *)recentPhoto:(Photo *)photo
{
Recent *recent = nil;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Recent"];
request.predicate = [NSPredicate predicateWithFormat:@"photo = %@", photo];
NSError *error = nil;
NSArray *matches = [photo.managedObjectContext executeFetchRequest:request
error:&error];
if (!matches || ([matches count] > 1)) {
// handle error
} else if (![matches count]) {
recent = [NSEntityDescription insertNewObjectForEntityForName:@"Recent"
inManagedObjectContext:photo.managedObjectContext];
recent.photo = photo;
recent.lastViewed = [NSDate date];
request.predicate = nil;
request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"lastViewed"
ascending:NO]];
matches = [photo.managedObjectContext executeFetchRequest:request
error:&error];
if ([matches count] > RECENT_PHOTOS_MAX_NUMBER) {
[photo.managedObjectContext deleteObject:[matches lastObject]];
}
} else {
recent = [matches lastObject];
recent.lastViewed = [NSDate date];
}
return recent;
}
当我们在RegionPhotosTVC中segue查看图片时,我们更新数据库的Recent实体,所以我们需要把这个方法公开,在PhotosTVC.h中(注意我们改变通用类)添加:
- (void)prepareViewController:(id)vc
forSegue:(NSString *)segueIdentifier
fromIndexPath:(NSIndexPath *)indexPath;
然后在RegionPhotosTVC中重写上面的方法
- (void)prepareViewController:(id)vc
forSegue:(NSString *)segueIdentifier
fromIndexPath:(NSIndexPath *)indexPath
{
Photo *photo = [self.fetchedResultsController objectAtIndexPath:indexPath];
[Recent recentPhoto:photo];
[super prepareViewController:vc
forSegue:segueIdentifier
fromIndexPath:indexPath];
}
最后,和其他的一样我们需要设置fetchedResultsController
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
...
- (void)awakeFromNib
{
[super awakeFromNib];
[[NSNotificationCenter defaultCenter] addObserverForName:PhotoDatabaseAvailabilityNotification
object:nil
queue:nil
usingBlock:^(NSNotification *note) {
self.managedObjectContext = note.userInfo[PhotoDatabaseAvailabilityContext];
}];
}
- (void)setManagedObjectContext:(NSManagedObjectContext *)managedObjectContext
{
_managedObjectContext = managedObjectContext;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Photo"];
request.predicate = [NSPredicate predicateWithFormat:@"recent != nil"];
request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"recent.lastViewed"
ascending:NO]];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:nil
cacheName:nil];
}
好了,运行一下吧!
至此,我们已经把Required Task中除了最后一个Task11(iPad版本我们没做)和没有显示thumbnail(Task 8),已经全部完成了。以上的代码我已经传到csdn上了,之所以没有早贴出来,是希望自己敲出来!
http://download.csdn.net/detail/asdfg13697116596/9147497
后面,我会继续更新如何完成Extra Credit中的一些要求。