我正在使用一些与CoreData交互的现有代码。我做了一些改变,后来才意识到引入了回归。我能够隔离引入问题的代码行,但我不能为我的生活理解为什么它是一个问题。
代码涉及阅读文章并将其标记为已读。我没有对标记代码进行任何更改,并确定仍能正常运行。但是,在获取阅读文章列表的另一层代码中,我做了以下更改:
//Old
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
...
[self retrieveReadArticles];
...
}
- (void)retrieveReadArticles {
userHistory = [UserHistory retrieveUserHistory]; //stored in iVar
self.readArticles = userHistory.readArticles;
}
以上工作正常,并提供了阅读文章的最新列表。
//New
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
...
[self retrieveReadArticles];
...
}
- (void)retrieveReadArticles {
UserHistory* userHistory = [UserHistory retrieveUserHistory]; //local variable
self.readArticles = userHistory.readArticles;
}
此范围的更改会破坏功能,并导致读取文章列表永远不会更新。
我和一位同事推测,ivar允许操作完全完成,而局部变量不能正确保留,并且在返回更新之前超出范围。任何人都可以指向我解释这种意外行为的资源吗?
答案 0 :(得分:0)
看起来标记代码毕竟可能是问题所在。我们正在检索现有阅读文章的字典,添加另一个条目,并再次保存_sb.Length = 0;
new System.Xml.Serialization.XmlSerializer(obj.GetType()).Serialize(System.Xml.XmlWriter.Create(new System.IO.StringWriter(_sb), _settings), obj);
System.Diagnostics.Debug.WriteLine(_sb);
对象。更改该代码以使用现有的阅读文章创建一个全新的字典似乎可以解决问题,而无需使用ivar范围。