2013-03-22 85 views
0

所以这是我一直在经历的个人挑战,我会很乐意帮助。从Big Nerd Ranch iOS书籍(第3版)开始,我正在研究编辑和改进他们的第29章Nerdfeed项目(我附上了一个谷歌驱动器链接,下载整个项目)。我希望能够按照我的意愿删除特定时间段之前的所有项目。说(假设地说)这个应用程序的饲料提供了昨天的帖子。我不希望这些帖子存储在我的应用程序中的任何位置,并且希望确保仅在今天创建的帖子显示在应用程序中。有谁知道如何去做这件事?我一直在尝试使用以下我写的代码片断来删除旧的feed/items。不幸的是,放置这段代码变得很麻烦,我似乎无法摆脱所有事情(从缓存,表格数据和抓取的数据)。当试图通过动画从桌面视图中删除项目(一致出界错误)时,真正的问题会生效。通过日期/时间限制删除旧的缓存和tableview的数据通过日期/时间限制

if ([[[channelCopy items] lastObject] class] == [BNRItem class]) { 

    NSDate *cutOffDate = [[NSDate date] dateByAddingTimeInterval:kfeedCutOff*24*60*60]; 
    NSLog(@"Response: %d",[[[[channelCopy items] lastObject] publishDate] compare:cutOffDate]); 
    while (([[channelCopy items]lastObject] != NULL) && ([[[[channelCopy items] lastObject] publishDate] compare:cutOffDate] == NSOrderedAscending)) { 
     NSLog(@"Removed: %@", [[channelCopy items] lastObject]); 
     [[channelCopy items] removeLastObject]; 
    } 
} 

我已经尝试添加下面的代码片段fethEntries内:

int itemDelta = newItemCount - currentItemCount; 
if (itemDelta > 0) { 
    NSMutableArray *rows = [NSMutableArray array]; 
    for (int i = 0; i < itemDelta; i++) { 
     NSIndexPath *ip = [NSIndexPath indexPathForRow:i inSection:0]; 
     [rows addObject:ip]; 
    } 

    [[self tableView] insertRowsAtIndexPaths:rows withRowAnimation:UITableViewRowAnimationTop]; 
} 
else if (itemDelta < 0) { //Removes outdated cells from the tableView 
    NSLog(@"We have a problem"); 
    NSMutableArray *rows = [NSMutableArray array]; 
    for (int i = 0; i > itemDelta; i--) { 
     NSIndexPath *ip = [NSIndexPath indexPathForRow:(i + currentItemCount) inSection:0]; 
     [rows addObject:ip]; 
    } 
    [[self tableView] deleteRowsAtIndexPaths:rows withRowAnimation:UITableViewRowAnimationBottom]; 
} 

我听说tableViews需要的,如果你删除零标记至少一行插入...我”我也尝试过。有什么想法吗?

Project Link

+0

CoreData + NSFetchResultController + NSManagedObject谁处理日期对象。然后,这是一个孩子玩,让你的对象按照你想要的方式排序。和NSFetchResultController是真的为此。因为你现在正在做的是一个有点丑陋;) – 2013-03-22 15:55:19

+0

这是丑陋的时候试图删除项目....我从来没有看过NSFetchResultController之前。它是否仅用于核心数据?这个应用程序不会严重依赖核心数据。它通过NSCoding协议缓存数据。我非常肯定,检修方式将会进行重大改革。这是诚实的路线吗? – TheCodingArt 2013-03-22 16:47:23

+0

嗯...实际上没有。比方说,如果你只为这一个代码做一次。但是它比使用NSFetchedResultController更具挑战性。我认为如果仅仅是发布日期,你可以用NSPredicate做一些“简单”的事情。这可以适用于最多100/200条目;但是如果你有,比方说10000个条目,这种技术会很慢。所以是的,你可以使用简单的NSPredicate。 – 2013-03-25 08:19:34

回答

0

因为,假设你只有日期到您的实现代码如下;并且您希望删除当前时间以下的所有日期。

NSDate* date   = [NSDate date]; 

// SELF will means "date" into the context. "SELF >=" equal to compare NSOrderedAscending 
// predicate will be used into a mutable array of dates. 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SELF >= %@)", date]; 

// this array is used for the tableView display 
[myMutableArrayForTableView filterUsingPredicate: predicate]; 

// Since tableview use myMutableArrayForTableView , now you can update the content: 
[(UITableView*)self.view reloadData]; 

参见4行代码。你应该使用NSpredicate,因为你不需要重新发明轮子。 但我已经宠坏你,现在你知道答案;)

+0

这是一个很好的研究方法,我并不是说试图重新发明轮子(虽然看起来方法看起来更清洁!)。我的主要问题是没有通过它进行筛选(因为我仍然有效)。它或多或少集中于放置。我似乎无法找到正确的区域来过滤这些信息,而不会导致表,缓存,表格数据源全部处于正确的同步状态。一旦我找到了应该放置的位置,我正计划完善我的方法。 – TheCodingArt 2013-03-25 18:33:51