2016-11-13 136 views
2

这是一个RSS阅读器应用程序。我实例化我的模型对象,调用setupFavIcon()以下载创建对象时为零的favIcon。然后我将每个对象添加到领域。但是,当图标实际上被提取时,self就是零,所以我无法更新应用的UI。我不明白为什么自己变成零。Realm-iOS:模型对象在添加到领域时变为零

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) 
     } 
    } 
    } 

回答

1

您应该保持对您的文章对象的强烈参考。当你从领域加载它们时,你需要将它们保持在一个阵列中。如果您使用领域的结果进行操作,则在方法TableViewCell setupFavIcon结束时会释放它们。

+0

是的,我的应用程序直接从领域使用数据。现在,我将对象存储在单独的数组中,并且仅在没有Internet连接时才从域中获取数据。现在,favIcons显示正确。谢谢! –

1

您使用downloadFavIcon封闭,最有可能是被异步调用weak参考self,所以你的对象可能已经释放。您需要在闭包中使用强引用,或者在某处保留对对象的强引用。

另请注意:如果将对象添加到领域,则对象(添加,修改和删除)的所有更改都必须在写入事务中完成。