0

我正在使用NSFetchedResultsController來處理進出我的UITableView的數據。它一切正常,直到我把一個NSPredicate放在它上面。我需要獲取與至少一條未過期或尚未設置expiration_date的消息有關係的所有Thread對象。所以我使用下面的謂詞。NSFetchedResultsController與NSPredicate

NSPredicate *threadPredicate = [NSPredicate predicateWithFormat:@"ANY messages.expiration_date == null OR ANY messages.expiration_date > %@", [NSDate date]]; 

問題是這導致NSFetchedResultsController的行爲非常奇怪。如果線程在其消息關係中獲得新消息,則刪除該行。它也不會插入新的。

我100%確定它是導致這些行爲的NSPredicate。沒有它,一切正常,我只是沒有一些我不想過濾掉的數據。

下面是我的數據模型中討論的部分的圖片。我還將包含我的NSFetchedResultsController的代碼。

/** 
* Returns a NSFetchedResultsController for the unified inbox 
* 
* @return Controller for fetched results 
*/ 
- (NSFetchedResultsController *)resultsControllerForUnifiedInbox 
{ 
    NSFetchRequest  *threadsRequest = [NSFetchRequest fetchRequestWithEntityName:@"Thread"]; 
    NSEntityDescription *threadModel = [NSEntityDescription entityForName:@"Thread" inManagedObjectContext:_mainManagedObjectContext]; 

    [threadsRequest setEntity:threadModel]; 

    NSPredicate *threadPredicate = [NSPredicate predicateWithFormat:@"ANY messages.expiration_date == null OR ANY messages.expiration_date > %@", [NSDate date]]; 

    [threadsRequest setPredicate:threadPredicate]; 

    NSSortDescriptor *threadSort = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO]; 

    [threadsRequest setSortDescriptors:[NSArray arrayWithObject:threadSort]]; 
    [threadsRequest setFetchBatchSize:LiftFetchControllerAtrributeBatchSize]; 

    NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:threadsRequest 
                           managedObjectContext:_mainManagedObjectContext 
                           sectionNameKeyPath:nil 
                              cacheName:nil]; 

    return fetchedResultsController; 
} 

enter image description here

回答

2

我無法解釋你所觀察到的謂詞的奇怪的效果,但我認爲 你的謂詞是沒有做你的期望。

[NSPredicate predicateWithFormat:@"ANY messages.expiration_date == null OR ANY messages.expiration_date > %@", [NSDate date]]; 

發現有到期日期的消息沒有設置或者未過期可能不同消息的所有線程。你(可能)需要改爲

[NSPredicate predicateWithFormat:@"SUBQUERY(messages, $m, $m.expiration_date == null OR $m.expiration_date > %@)[email protected] > 0", [NSDate date]]; 
+0

太棒了,工作。我將不得不看看這個SUBQUERY函數,它可以放在NSPredicate裏面。謝謝! –

+0

@CodyRobertson:不幸的是,SUBQUERY文檔記錄很差。但是您可以在[NSExpression類參考]中的'expressionForSubquery:usingIteratorVariable:predicate:'的文檔中找到類似的情況(https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/類/ NSExpression_Class /參考/ NSExpression.html)。也許這有幫助。 –

相關問題