我正在编写一个使用核心数据来存储我的数据的应用程序.其中包括一个日期字段,我只对日期而不是时间感兴趣.我需要根据日期(而不是时间)选择记录,因此我在NSDate上创建了一个类别以返回日期,标准化为设定时间,如下所示:
+ (NSDate *)dateWithNoTime:(NSDate *)dateTime {
if( dateTime == nil ) {
dateTime = [NSDate date];
}
NSDateComponents* comps = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:dateTime];
NSDate *dateOnly = [[NSCalendar currentCalendar] dateFromComponents:comps];
[dateOnly dateByAddingTimeInterval:(60.0 * 60.0 * 12.0)]; // Push to Middle of day.
return dateOnly;
Run Code Online (Sandbox Code Playgroud)
}
然后我在将数据添加到核心数据存储时使用它(我有一个使用此方法设置原始日期值的setter)然后我使用此方法创建一个日期,用于比较执行日期时的日期获取请求.因此理论上这应该总是有效 - 即挑出我正在寻找的日期.
我有点紧张,因为我不完全确定改变时区或地区会有什么影响.它还能用吗?
仅当您对时间不感兴趣时,在日期存储和搜索时,最佳做法是什么.
干杯.
编辑
阅读推荐的讨论后,我认为我应该修改我的代码如下.我的想法是,如果我确保将其推送到特定日历系统和特定时区(UTC),则无论您在设置日期和阅读日期时的位置,日期都应始终相同.对此新代码的任何评论都表示赞赏.
+ (NSDate *)dateWithNoTime:(NSDate *)dateTime {
if( dateTime == nil ) {
dateTime = [NSDate date];
}
NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
[calendar setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
NSDateComponents …Run Code Online (Sandbox Code Playgroud) 我有一个UICollectionView,我正在尝试使用backgroundView属性设置背景图像,如果CollectionView中有任何数据.我有导航将更改数据,并重新加载集合视图(调用[self.collectionView reloadData]).出于某种原因,我得到了非常奇怪的结果.首先,有时当我设置属性时,它会出现在collectionView单元格的顶部并遮挡它们.其次,当我尝试更改属性时,它不会在屏幕上更改.这让我疯了!实施起来似乎很简单!
所以在Code中.在viewDidLoad对UICollectionViewController
- (void)viewDidLoad {
[self loadSections];
[self setupBackgroundView;
}
Run Code Online (Sandbox Code Playgroud)
Load sections方法只是加载我用于集合视图的数据,然后它还调用一个方法来设置背景视图,根据是否有如下数据来决定要添加的视图:
- (void)loadSections {
[self loadPictures];
[self setupBackgroundImage];
}
- (void)setupBackgroundImage {
if ([self.sections count] == 0 || !self.sections) {
self.collectionView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"TakePhoto"]];
}
else {
self.collectionView.backgroundView = nil;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当视图首次加载时,如果没有数据,那么没有单元格显示背景图像正确显示.然后我更改数据,现在我要显示一些单元格,调用setupBackgroundImage,我可以验证backgroundImage属性是否设置为nil(我甚至在此处进行了断点检查并检查了值,它是nil).但背景图像仍然可见.
此外,如果我将nil更改为另一个图像,则不会显示此新图像.
而且更奇怪.如果我显示了一些单元格并设置了背景图像,则此图像会整齐地显示在单元格后面.如果我然后使用新数据集重新加载数据,则图像将显示在单元格前面,使其模糊.我不知道这是怎么发生的,因为后台视图应该落后于所有其他人.
有谁知道为什么会这样.是否在任何地方缓存?或者我只是做些傻事?我在这里完全失去了 - 花了更多的时间在这上面而不是编写它使用的自定义布局!
我正在编写一个可重用的类,但我已经包含了对一个类的调用,这些类在编译时可能并不总是可用.
更具体地说,我正在使用Flurry分析,我希望包含对它的调用 - 但并非每个可以包含该模块的项目都可以访问Flurry库 - 我只是希望它不能在这些代码中编译的情况.该模块将作为源代码分发,因此只需在编译时进行测试.
到目前为止,我尝试过:
if([Flurry class]){
[Flurry logEvent:@"Blah"];
}
Run Code Online (Sandbox Code Playgroud)
这失败了"使用未定义的标识符" - Flurry没有在任何地方定义,因为没有对库的弱引用
接下来尝试了:
Class flurryClass = NSClassFromString(@"Flurry");
if(flurryClass){
[flurryClass logEvent:@"Blah"];
}
Run Code Online (Sandbox Code Playgroud)
这失败了"没有选择器logEvent的已知类方法"
所以我似乎陷入困境,因为第一种方法依赖弱链接一个可能无法用于弱链接的库!我假设第二种方法失败,因为我在一个当前没有定义的类上调用Class方法,所以编译器会抱怨?有没有人能想到的任何解决方案?
我有一个包含2个实体的托管对象模型.
其中一个实体(让我们称之为EA)通过引用第二个实体的子集(Call it EB)中的一些属性来计算它的属性.
在EA中我设置了一个带有谓词的"Fetched Property",它返回我需要的EB对象的子集.
当我删除,插入EB对象或更改EB对象时,我使用通知来确保EA保持最新.因此,例如在"保存"之后,EA对象将重新计算它的属性.
我的问题是,当我访问所取得的属性(我做内的EB使用模型类[self valueForKey:FetchedPropertyKeyName]),它似乎只提取缓存版本.换句话说,第一次没问题,但是当我添加另一个EA对象时,我在访问fetched属性时没有在返回的数组中看到它.当我删除一个对象时,这是最明显的,因为这个对象不再存在,导致崩溃.
Fetched Properties的文档说:
如果更改了目标实体中的对象,则必须重新评估fetched属性以确保它是最新的.您使用refreshObject:mergeChanges:手动刷新属性 - 这会导致在下次触发对象故障时再次执行与此属性关联的获取请求.
对不起,如果这听起来是一个愚蠢的问题,但不幸的是我没有看到我应该打电话到哪里refreshObject:mergeChanges:?