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

这篇文章是针对斯坦福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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值