2016-11-13 4 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"] 
    } 
} 

閉鎖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

Articleオブジェクトを強く参照してください。レルムからロードする際には、配列を保持する必要があります。レルムの結果を操作する場合、メソッドTableViewCell setupFavIconが終了すると解放されます。

+0

はい、私のアプリはレルムから直接データを使用していました。今は別の配列にオブジェクトを格納し、インターネットに接続していないときにのみ領域からデータを取得します。今、favIconが適切に表示されます。ありがとう! –

1

あなたが最も可能性の高い非同期的に呼び出されたdownloadFavIcon閉鎖中selfからweak参照を使用するので、あなたのオブジェクトがすでに割り当てを解除することができます。クロージャーで強い参照を使用するか、オブジェクトのどこかを強く参照する必要があります。

注意:オブジェクトがレルムに追加された場合、オブジェクトに対する変更(追加、変更、削除)はすべて、書き込みトランザクション内で実行する必要があります。

関連する問題