这是一个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"]
}
}
Closure 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)
}
}
}
答案 0 :(得分:2)
您应该对文章对象保持强烈的引用。从领域加载它们时,需要将它们保存在数组中。如果您对领域的结果进行操作,则在方法TableViewCell setupFavIcon结束时释放它们。
答案 1 :(得分:1)
您在weak
闭包中self
引用downloadFavIcon
,这很可能是异步调用的,因此您的对象可能已被解除分配。您需要在闭包中使用强引用或在某处保留对对象的强引用。
另请注意:如果将对象添加到Realm,则必须在写入事务中完成对对象的所有更改(添加,修改和删除)。