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;
}
太棒了,工作。我將不得不看看這個SUBQUERY函數,它可以放在NSPredicate裏面。謝謝! –
@CodyRobertson:不幸的是,SUBQUERY文檔記錄很差。但是您可以在[NSExpression類參考]中的'expressionForSubquery:usingIteratorVariable:predicate:'的文檔中找到類似的情況(https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/類/ NSExpression_Class /參考/ NSExpression.html)。也許這有幫助。 –