斯坦福iOS7 2013-2014秋Assignment 6的一种答案 #8

来源:互联网 发布:sql trigger insert 编辑:程序博客网 时间:2024/05/21 12:51

这篇文章是针对斯坦福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中的一些要求。


0 0
原创粉丝点击