【发布时间】:2015-07-21 17:21:54
【问题描述】:
我正在尝试制作一个 RSS 阅读器,它有一个每 30 分钟左右更新一次的数据库(我目前有 10 秒进行测试),当你选择一组你想要查看的提要时,它需要它们从数据库中取出并放入一个名为 feedItems 的数组中。此数组仅在 viewDidLoad 中修改以从数据库中复制它,并且当单元格配置为查看该特定帖子是否已被删除时。
override func viewDidLoad() {
super.viewDidLoad()
self.title = theTitle
let fetchRequest = NSFetchRequest(entityName: "Feed")
if let fetchResults = managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as? [Feed] {
for f: Feed in fetchResults{
if f.category == theUrl{
feedItems.append(f)
}
}
feedItems.sort({ self.getFeedId($0.url).toInt() > self.getFeedId($1.url).toInt() })
}
if deletedFeeds.count > 10000 {
deletedFeeds = []
}
}
单元配置:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("FeedCell", forIndexPath: indexPath) as! UITableViewCell
let item = feedItems[indexPath.row] as Feed
// Configure the cell...
if contains(deletedFeeds, getFeedId(item.url)){
feedItems.removeAtIndex(indexPath.row)
}else{
cell.textLabel?.text = item.name
cell.detailTextLabel?.text = item.summary
}
return cell
}
问题在于,如果数据库(它是一个核心数据数据库,并在单独的线程上更新)在您位于包含所有帖子的 tableViewController 中更新时,则数组 feedItems 中每个项目的所有对象变为 nil,如果单击单元格或向下滚动 tableview,则会导致程序崩溃,因为每个单元格的 url 都是 nil。我不知道为什么会发生这种情况,因为除了 viewDidLoad 之外,我没有写任何应该从数据库中更新 feedItems 数组的东西。如果我退出 tableViewController 控制器并导航回它,它会更新得很好。如果我在更新时留在 tableViewController 中,为什么数组中的每个对象都变为 nil?如何修复它以便在我仍在该 tableViewController 中时正确更新?
【问题讨论】:
-
您可能在某处违反了多线程 CoreData 的规则之一。你读过how to handle multithreaded core data吗?
-
核心数据更新后,您能否通知带有表的视图控制器重新加载它的数据?
标签: ios swift uitableview core-data updates