ios - 核心数据对象未正确更新或发布定义日期组件

标签 ios core-data nscalendar

在我的应用程序中,我有一个带有 部分的UITableView。每个实体对象都根据名为“sectionIdentifier”的 transient 属性进行排序,该属性在名为 ToDoItem.m 的 NSManagedObject 子类中定义 当应用程序启动时,所有对象都会正确排序并显示在预期部分下。 在 TableView Controller 上有一个添加按钮来添加一个新对象,点击它之后,应用程序会抛出以下警告:

2014-01-15 11:19:19.459 To-Do Pro Light[21914:a0b] date= (null)
2014-01-15 11:19:19.461 To-Do Pro Light[21914:a0b] todayDate = 2014-01-15 18:19:19 +0000
2014-01-15 11:19:19.473 To-Do Pro Light[21914:a0b] *** -[__NSCFCalendar components:fromDate:]: date cannot be nil

我的意思是说真的,你认为这个操作对于 nil 日期应该意味着什么? 现在已经避免了异常。 这些错误中的一些将通过此投诉进行报告,然后进一步的违规行为将简单地默默地做任何由 nil 产生的随机结果。 这是这次发生的回溯(由于编译器优化,某些帧可能会丢失):

(
    0   CoreFoundation                      0x01ab8475 -[__NSCFCalendar components:fromDate:] + 101
    1   CoreFoundation                      0x01b5496c -[_NSCopyOnWriteCalendarWrapper components:fromDate:] + 92
    2   To-Do Pro Light                     0x00008e95 -[ToDoItem sectionIdentifier] + 357
    3   Foundation                          0x0145b947 _NSGetUsingKeyValueGetter + 119
    4   CoreData                            0x0029d75a _PF_Handler_Public_GetProperty + 122
    5   CoreData                            0x0029d685 -[NSManagedObject valueForKey:] + 149
    6   Foundation                          0x0147aa5a -[NSObject(NSKeyValueCoding) valueForKeyPath:] + 409
    7   CoreData                            0x003696ed -[NSFetchedResultsController(PrivateMethods) _objectInResults:] + 77
    8   CoreData                            0x00369995 -[NSFetchedResultsController(PrivateMethods) _preprocessInsertedObjects:insertsInfo:newSectionNames:] + 389
    9   CoreData                            0x0036c1bd -[NSFetchedResultsController(PrivateMethods) _managedObjectContextDidChange:] + 1197
    10  Foundation                          0x01500bf9 __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke + 40
    11  CoreFoundation                      0x01b06524 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 20
    12  CoreFoundation                      0x01a5e00b _CFXNotificationPost + 2859
    13  Foundation                          0x0143a951 -[NSNotificationCenter postNotificationName:object:userInfo:] + 98
    14  CoreData                            0x00271173 -[NSManagedObjectContext(_NSInternalNotificationHandling) _postObjectsDidChangeNotificationWithUserInfo:] + 83
    15  CoreData                            0x0031078f -[NSManagedObjectContext(_NSInternalChangeProcessing) _createAndPostChangeNotification:withDeletions:withUpdates:withRefreshes:] + 367
    16  CoreData                            0x0026c608 -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] + 2152
    17  CoreData                            0x0026bd99 -[NSManagedObjectContext processPendingChanges] + 41
    18  CoreData                            0x0023ffe1 _performRunLoopAction + 321
    19  CoreFoundation                      0x01a724ce __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30
    20  CoreFoundation                      0x01a7241f __CFRunLoopDoObservers + 399
    21  CoreFoundation                      0x01a50344 __CFRunLoopRun + 1076
    22  CoreFoundation                      0x01a4fac3 CFRunLoopRunSpecific + 467
    23  CoreFoundation                      0x01a4f8db CFRunLoopRunInMode + 123
    24  GraphicsServices                    0x038bb9e2 GSEventRunModal + 192
    25  GraphicsServices                    0x038bb809 GSEventRun + 104
    26  UIKit                               0x0059bd3b UIApplicationMain + 1225
    27  To-Do Pro Light                     0x000078ad main + 141
    28  libdyld.dylib                       0x020e6725 start + 0
)
2014-01-15 11:19:19.478 To-Do Pro Light[21914:a0b] Tmp= 0
2014-01-15 11:19:19.524 To-Do Pro Light[21914:a0b] Fecha del todo = 2014-01-15 18:19:19 +0000

我无法理解,但在唯一的文件中有日历组件是在 ToDoItem.m NSManagedObject 类中,我向您展示:

#import "ToDoItem.h"
#import "ToDoGroup.h"
#import "ToDoSubItem.h"


@implementation ToDoItem

@dynamic todoDescription;
@dynamic todoName;
@dynamic todoDueDate;
@dynamic sectionIdentifier;
@dynamic todogroup;
@dynamic todosubitems;



-(NSString *)sectionIdentifier{

    [self willAccessValueForKey:@"sectionIdentifier"];
    NSString *tmp = [self primitiveValueForKey:@"sectionIdentifier"];
    [self didAccessValueForKey:@"sectionIdentifier"];

    if (!tmp){

        NSDate *date = self.todoDueDate;
        NSDate *todayDate = [NSDate date];

        NSLog(@"date= %@",date);
        NSLog(@"todayDate = %@",todayDate);


        NSCalendar *calendar = [NSCalendar currentCalendar];
        NSInteger comps = (NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit);
        NSDateComponents *date1Components = [calendar components:comps fromDate:date];
        NSDateComponents *date2Components = [calendar components:comps fromDate:todayDate];
        date = [calendar dateFromComponents:date1Components];
        todayDate = [calendar dateFromComponents:date2Components];




        if([date
            compare:todayDate] == NSOrderedSame) {
            tmp = @"1";//TODAY
        }
        else if([date
                 compare:todayDate] == NSOrderedDescending){
            tmp = @"2";//OVERDUE
        }
        else if ([date
                  compare:todayDate] == NSOrderedAscending){
            tmp =@"0";//UPCOMING
        }
        NSLog(@"Tmp= %@",tmp);

        [self setPrimitiveValue:tmp forKey:@"sectionIdentifier"];

    }
    return tmp;

}

@end

欢迎任何帮助,如果你想让我给你看我的 tableView Controller ,没问题...... 提前谢谢你。

最佳答案

也就是说

 NSDate *date = self.todoDueDate;

返回nil,即您没有为新创建的对象设置todoDueDate

您不能从 nil 日期计算日期组件。

关于ios - 核心数据对象未正确更新或发布定义日期组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21145422/

相关文章:

ios - 使用 PayPal iOS 框架在 iOS 应用程序中捐款

ios - 使用 Core Data 在 Apple Watch 和 iPhone 之间共享数据

ios - 如何安全地解包我的核心数据对象

ios - 使用 Realm 数据作为应用程序设置

ios - 自动将 HTML <img> 从 WKWebView 保存到应用程序的 tmp 目录

iphone - 是否可以在应用程序运行时即时更改 Tabbar 项目文本/图标?

macos - "Save As"不适用于我的 NSPersistentDocument 应用程序

ios - 如何获取相对于 GMT 以外时区的 NSCalendarComponent 值?

ios - 在 Xcode 中确定 iDevice 当前日期 - NSDate

iPhone iOS NSDate 如何检测日期范围是否包括月初?