繁体   English   中英

内存问题可能与 RxCocoa 绑定方法有关

[英]Memory Issue Possibly Related RxCocoa Binding Method

我有这个 RxCocoa 的绑定方法:

   func bindTableView() {
        data.asObservable()
            .bind(to: tableView
                    .rx
                    .items(cellIdentifier: dealCellID, cellType: DealTabCell.self)
            )
        {
            row, profileData, cell in
            cell.configureProfile(dataModel: profileData)
        }
        .disposed(by: disposeBag)
    }

数据来自 Firebase,但它会立即加载,当我向下滚动时,内存使用量会超过 1.7 GB。 我认为可重复使用的单元格会自动处理内存,因为如果您没有看到单元格,它就不会使用内存。

Firebase 关闭:

db.collectionGroup("deals").whereField("Sender", isEqualTo: senderEmail!).addSnapshotListener { (snapshot, error) in
            guard error == nil else {
                print("error?.localizedDescription collectiongroup = \(error?.localizedDescription)")
                return
            }
            self.dealNumber = snapshot?.documents.count ?? 0
            DispatchQueue.main.async {
                self.dealsPosted.attributedText = NSMutableAttributedString()
                    .bold("\(self.dealNumber)\n")
                    .normal("Deals")
            }
            for document in snapshot!.documents {
                let data = document.data()
                if let sender = data["Sender"] as? String,
                   let image = data["ImagePath"] as? String,
                   let dealTitle = data["DealTitle"] as? String,
                   let dealDesc = data["DealDesc"] as? String,
                   let storeID = data["StoreID"] as? String,
                   let storeTitle = data["StoreTitle"] as? String,
                   let dealID = data["DealID"] as? String,
                   let userName = data["UserName"] as? String,
                   let distance = data["Distance"] as? Double,
                   let senderUID = data["SenderUID"] as? String {
                    
                    self.getImageFromURLfromFirebase(path: image, dealTitle: dealTitle, dealDesc: dealDesc, storeTitle: storeTitle, storeID: storeID, dealID: dealID, sender: sender, userName: userName, distance: distance, senderUID: senderUID)
                }

在那个 getImageFromURLfromFirebase 方法中,我只是从 url 下载图像,并且行为中继接受另一个值。 我可以提供额外的代码。 这意味着每次类似这样的工作时,在该 firebase 方法的循环中:

DispatchQueue.main.async {
                    userDealsRelay.accept(userDeals.removingDuplicates())
                }

那个对象是这样的:

let userDealsRelay : BehaviorRelay<[DealModel]> = BehaviorRelay(value: [])

我确信内存使用是由 tableview 引起的,因为它只在我向下滚动时发生。
顺便说一句,当我在底部并再次上升时它会停止。 它不是无限增长的。

struct DealModel: Hashable {
    var storeID: String?
    var dealImage: UIImage?
    var dealTitle: String?
    var dealDesc: String?
    var dealID : String?
    var storeTitle: String?
    var sender: String?
    var userName: String?
    var distance: Double?
    var senderUID: String?
    
    init(storeID: String?, dealImage: UIImage?, dealTitle: String?, dealDesc: String?, dealID: String?, storeTitle: String?, sender: String?, userName: String?, distance: Double?, senderUID: String?) {
        self.storeID = storeID
        self.dealImage = dealImage
        self.dealDesc = dealDesc
        self.dealTitle = dealTitle
        self.dealID = dealID
        self.storeTitle = storeTitle
        self.sender = sender
        self.userName = userName
        self.distance = distance
        self.senderUID = senderUID
    }
}

let profileData: DealModel

这与 RxCocoa 的绑定方法无关。

您的DataModel包含一个 UIImage。 您正在下载每个单元格的图像并将图像缓存在 DataModel 中。 因此,随着更多单元格的显示,您的记忆力应该会增加。 即使您不使用 Rx,也会发生这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM