Ios 排序/筛选NSFetchRequest如何写入排序描述符taht将使用当前日期?
我在Ios 排序/筛选NSFetchRequest如何写入排序描述符taht将使用当前日期?,ios,sorting,filter,nsfetchrequest,nsfetchedresultscontroller,Ios,Sorting,Filter,Nsfetchrequest,Nsfetchedresultscontroller,我在核心数据中存储了两个日期属性,一个是过期日期,第二个是“琥珀色”日期(过期日期前X周的日期)。我想按以下方式对结果进行排序: 琥珀色日期之前的项目-(绿色)现在
核心数据中存储了两个日期属性,一个是过期日期,第二个是“琥珀色”日期(过期日期前X周的日期)。我想按以下方式对结果进行排序:
- 琥珀色日期之前的项目-(绿色)现在<琥珀色
- 琥珀色日期之后但过期日期之前的项目-(琥珀色)琥珀色解决方案是:删除
@synthesis state=\u state
和-(void)setState:(int16_t)state{}
并离开@dynamic state。然后在evaluateState
中,而不是[自设置状态:pState]代码>我使用的self.state=pState代码>现在它根据需要进行排序。我会将评估作为一个单独的操作运行(对使用NSFetchRequest
获取的项目),并让FRC只处理UI,从纸面上看,您使用了更多的资源,但它允许您使用FRC的批次来补偿。但是是的-在同步调用performFetch:
之后,您可以访问获取的项目,因此如果节不是按照您期望的方式构建的,您应该检查评估代码。评估似乎有效,唯一的问题是它不适用于排序:),因此状态在单元格中使用并正确显示(如预期的那样)已计算的状态,但它没有按我认为应该排序的方式进行排序:)从evaluteState
调用时,setState
调用save,因此它应该被存储,但它不是这样,这可能是问题所在?无论如何,请您在回答中详细说明您的解决方案,并尽可能详细:)由于客观cSo对我来说仍然是全新的,问题是您无法阅读修改后的属性?真奇怪。我理解你的代码是因为evaluateTestate
属于实体类类别,如果是这样,请共享setter代码,我猜你一定是在使用一些棘手的东西,比如关联对象。我更新了问题我明白了,你需要刷新对象,使用这种setter更改了哪些属性,尝试使用NSManagedObjectContext-refreshObject:mergeChanges:
。
@property (nonatomic, assign) int16_t state;
NSFetchRequest *fetchRequest =
[NSFetchRequest fetchRequestWithEntityName:@"MyTable"];
NSSortDescriptor *sortTitle =
[NSSortDescriptor sortDescriptorWithKey:@"name"
ascending:YES];
[fetchRequest setSortDescriptors:@[sortByTitle]];
NSFetchedResultsController *ctrl = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:[NSManagedObjectContext defaultContext]
sectionNameKeyPath:nil
cacheName:nil];
NSError* fetchError = nil;
if([ctrl performFetch:&fetchError] == NO) {
NSLog(@"Error: perform fetch failed, %@",[fetchError description]);
} else {
//do we have results here?
id <NSFetchedResultsSectionInfo> sectionInfo =
[ctrl.sections objectAtIndex:0];
NSArray * items = [sectionInfo objects];
for (int i=0; i<items.count; i++) {
CourseCD* item = items[i];
NSLog(@"%d - %@",i,item);
[item evaluateState];//category adds this method
}
}
-(State) evaluateState {
CourseComplianceState pState = StateUnknown;
if (self.expire == nil) {
[self setState:pState];
return pState;
}
NSDate* now = [[NSDate alloc] init];
pState = StateNotExpired;
if ([NSDate isDate:now inRangeFirstDate:self.thresholdDate
lastDate:self.expireDate]) {
//amber
pState = StateWithinThreshold;
} else if ([NSDate isDate:now inRangeFirstDate:self.expireDate
lastDate:[NSDate distantFuture]]){
//expired
pState = StateExpired;
}
//
[self setState:pState];
NSLog(@" - evaluateState -");
return pState;
}
enum {
StateUnknown,
StateNotExpired,
StateWithinThreshold,
StateExpired
};
typedef int16_t State;
//later I use following sort descriptors
NSSortDescriptor *sortState = [NSSortDescriptor
sortDescriptorWithKey:@"state"
ascending:YES];
NSSortDescriptor *sortExpire = [NSSortDescriptor
sortDescriptorWithKey:@"expire"
ascending:YES];
NSSortDescriptor *sortByTitle = [NSSortDescriptor
sortDescriptorWithKey:@"name"
ascending:YES];
NSFetchRequest *fetchRequest = [NSFetchRequest
fetchRequestWithEntityName:@"Course"];
[fetchRequest setSortDescriptors:@[sortState,sortExpire,sortByTitle]];
self.resultsController = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:[NSManagedObjectContext defaultContext]
sectionNameKeyPath:nil
cacheName:nil];
self.resultsController.delegate = self;
NSError* fetchError = nil;
if([self.resultsController performFetch:&fetchError] == NO) {
NSLog(@"Error: perform fetch failed, %@",[fetchError description]);
}
//.h
@property (nonatomic, assign) int16_t state;
//.m
@synthesize state=_state;
-(void) setState:(int16_t)state {
_state = state;
NSError* error = nil;
[[NSManagedObjectContext defaultContext] save:&error];
if(error != nil){
NSLog(@"Error in setState, details:%@",[error description]);
}
}