2013-03-22 54 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