0

我有一個UITable視圖,其中包含一個名爲Assignment的NSManagedObjects列表。我正在使用NSPredicate來過濾列表。 我過濾分配應顯示今天和昨天的玩家:使用NSManagedObject的幫助器方法進行NSPredicate過濾

NSPredicate *predicate = [NSPredicate predicateWithFormat: 
          @"player == %@ AND (day == %@ OR day == %@)", 
          player, 
          [NSNumber numberWithInt:[self todaysDayNumber]], 
          [NSNumber numberWithInt:[self yesterdaysDayNumber]]]; 

我需要添加過濾的級別。我想過濾掉只應該每兩週顯示一次的作業。所以我說這個方法來分配新建分配FY:

-(BOOL)thisWeeks{ 
    //If this is a weekly assigment 
    if ([self.weekly boolValue]) { 
    return YES; 
    } 

    //Determine the week number 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSUInteger unitFlags = NSWeekCalendarUnit; 
    NSDateComponents *dateComponents = [calendar components:unitFlags 
               fromDate:[NSDate date]]; 
    NSUInteger week = [dateComponents week]; 

    //Assigned week even? 
    if ([self.weekNumber intValue] % 2){ 
    //Current week even? 
    if (week % 2) { 
     return YES; 
    } 
    } 
    //Assigned week odd? 
    if (!week % 2) { 
    //Current week odd? 
    if (![self.weekNumber intValue] % 2){ 
     return YES; 
    } 
    } 
//Should not be shown this week. 
return NO; 
} 

是有可能使用這個helper方法「thisWeeks」作爲NSPredicate過濾器?如果我「做錯了」,我可以手動過濾獲取的結果,但我不確定如何將結果放回到NSFetchedResultsController中,以便我的UITable視圖可以繼續使用NSFetchedResultsController。

回答

1

NSPredicate也接受塊作爲謂詞。在這裏,在thisWeeks與第一次檢查的例子:

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id obj, NSDictionary *bind) { 
    return [self.weekly boolValue]; 
}]; 

現在,您可以實現該方法- (BOOL)thisWeeksWithObject:(ID)對象和寫:

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id obj, NSDictionary *bind) { 
    return [self thisWeeksWithObject:obj]; 
}]; 

當然,您必須將該方法中的self更改爲object

+0

看起來像一個很好的解決方案,但** predicateWithBlock **需要iOS 4.0或更高版本。有沒有辦法不使用predicateWithBlock? –

+0

我認爲你必須實現你的自定義方法,它遍歷所有提取的對象,並檢查它們是否有效,如果是的話,將它添加到數組,最後用所有檢查的對象返回數組。但與** predicateWithBlock **相比,此方法非常慢。 –