【发布时间】:2014-07-16 17:56:17
【问题描述】:
对于一些符合 NSCoding 的对象,我有一个非常基本的缓存系统。方法获取对象,提取键和搜索参数的一些信息,创建或更新 NSManagedObject,并将其保存到持久存储:
+ (void)updateQuestion:(StacManQuestion *)question site:(StacManSite *)site
{
// 1. Look up with a basic predicate.
SECachedQuestion *cachedQuestion = [SECachedQuestion
findFirstWithQuestionId:question.questionId site:site];
// 2. Create if missing.
if (!cachedQuestion) {
cachedQuestion = [SECachedQuestion MR_createEntity];
cachedQuestion.questionId = question.questionId;
cachedQuestion.site = site.apiSiteParameter;
}
// 3. Update properties.
cachedQuestion.isFavorite = question.favorited;
cachedQuestion.lastAccessTime = [NSDate date];
cachedQuestion.question = question;
// 4. Save
[[NSManagedObjectContext MR_contextForCurrentThread]
MR_saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) {
/* ... */
}];
}
此代码第一次运行时,运行良好。该对象被保存到缓存中,并可立即用于下一次运行。然而,在此之后,为 cachedQuestion.question 分配一个新值将无济于事。
我添加了一些断点,发现如下:
-
问题的分配没有更新
changedValues:(lldb) po [cachedQuestion changedValues] { lastAccessTime = "2014-07-16 17:16:45 +0000"; } question和cachedQuestion.question以不同的地址开始,然后以相同的地址结束,因此肯定会发生分配。-
如果我在设置
cachedQuestion.question = nil的作业之前放置一个步骤,我会得到以下信息,但问题的记录会在重新分配时再次消失。(lldb) po [cachedQuestion changedValues] { lastAccessTime = "2014-07-16 17:16:45 +0000"; question = "<null>"; } 这是另一个超级好的东西。我继续做了一个测试,我只是为应用程序的几个版本设置了这是因为数据验证。cachedQuestion.question = nil。这对于单次运行中的后续查找工作正常,但每次应用程序启动第一次读取 cachedQuestion.question 时都会返回原始值!我可以确认已开始创建新的缓存问题并且 lastAccessTime 更新没有问题。只是这一字段被及时冻结。nil让它显示在更改的值中,但保存失败,因为它不是可选的。
更新
现在我正在做一个悲伤的黑客攻击,只要有更改,我就会删除旧记录并插入新记录。它工作得很好,但我更想知道出了什么问题。
【问题讨论】:
标签: ios core-data nsmanagedobject magicalrecord