这是一个RSS阅读器应用程序 . 我实例化我的模型对象,在其上调用setupFavIcon()以下载创建对象时为nil的favIcon . 然后我将每个对象添加到领域 . 但是当实际获取图标时,self为零,因此我无法更新应用程序的UI . 我不明白自己为什么变成零 .
class Article: Object {
dynamic var source = ""
dynamic var title = ""
dynamic var link = ""
dynamic var pubDate = Date()
dynamic var favIcon: Data?
dynamic var favIconDidLoad: (() -> ())?
func setupFavIcon(_ source: String) {
DownloadManager.sharedInstance.downloadFavIcon(source) { [weak self] icon in
if let icon = icon {
self?.favIcon = icon
self?.favIconDidLoad?()
}
}
}
override class func primaryKey() -> String? {
return "link"
}
override class func ignoredProperties() -> [String] {
return ["favIconDidLoad"]
}
}
关闭favIconDidLoad在我的TableViewCell类中定义,并在下载favIcon时调用 .
fileprivate func setupFavIcon(_ article: Article) {
if let favicon = article.favIcon {
setFavIcon(favicon)
} else {
article.favIconDidLoad = { [weak self] in
self?.setFavIcon(article.favIcon)
}
}
}
2 回答
您应该对文章对象保持强烈的引用 . 从领域加载它们时,需要将它们保存在数组中 . 如果您对领域的结果进行操作,则在方法TableViewCell setupFavIcon结束时释放它们 .
在
downloadFavIcon
闭包中使用weak
引用downloadFavIcon
很可能是异步调用的,因此您的对象可能已经被释放 . 您需要在闭包中使用强引用或在某处保持对对象的强引用 .另请注意:如果将对象添加到Realm,则必须在写入事务中完成对对象的所有更改(添加,修改和删除) .