Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 排序/筛选NSFetchRequest如何写入排序描述符taht将使用当前日期?_Ios_Sorting_Filter_Nsfetchrequest_Nsfetchedresultscontroller - Fatal编程技术网

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]);
        }
    }