ios - 在 iOS Swift 上从网络加载 MVVM 异步 UIImage

标签 ios swift design-patterns mvvm rx-swift

自从我在 iOS 上的第一个应用程序以来,我一直在使用 MVC……现在我想尝试 MVVM。
我的方法是模型可以包含远程 URL,并且 ViewModel 发出下载图像的请求。 (然后推到绑定(bind) View )...我认为这是合适的,以避免在 View 中发出网络请求(或者更糟糕的是,单元格!)

class Person: NSObject {
    var firstName: String?
    var lastName: String?
    var avatarURL: URL?
}
class PersonEntryViewModel {
    var name:String?
    var avatarImage:UIImage?

    init(person: Person?) {
        super.init()
        // omitted: binding self.name based on person.firstName & person.lastName
        var request: URLRequest? = nil
        if let avatarURL = person?.avatarURL {
            request = URLRequest(url: avatarURL)
        }
        fetchImageFromNetwork({ response, data in
            if let data = data {
                avatarImage = UIImage(data: data)
            }
        })
    }
}
你怎么看?
我的怀疑是关于内存的。我可以有一大堆充满 UIImages 的 View 模型......

最佳答案

如果每个单元格都有自己的 PersonEntryViewModel并且在单元格准备重用时被丢弃,那么内存不是问题,因为图像将同时被丢弃。

我认为最好不要将下载代码放在init方法中。最好有某种触发方法,您可以在将 View 模型传递给单元格时调用该方法。

这实际上取决于更大的架构是什么样的。

如果你想看一些在 Rx-MVVM-C 应用程序中处理图像的例子,那么在 RxSwift slack channel 中有几个很棒的例子:

https://rxswift.slack.com/archives/CTSAM9V27/p1583148003073800
https://rxswift.slack.com/archives/CTSAM9V27/p1583149698079500

前往此处加入讨论:https://rxslack.herokuapp.com

关于ios - 在 iOS Swift 上从网络加载 MVVM 异步 UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60727663/

相关文章:

c# - 绘图应用程序使用哪种设计模式

c# - 将命令模式调整为建立多个 API 连接的单例

ios - XCode 无法启动应用程序,不允许操作

iphone - 从 iPhone 中的照片库中获取所有图像

iphone - 如何在 Xcode 4.2 中下载应用程序数据

swift - 在 RxSwift 中合并两个通知观察者

swift - Realm 细粒度通知 Swift 3 语法

ios - 谷歌地图标记聚类

java - 跟踪类问题的良好设计模式是什么?

ios - 等待多个 Alamofire 请求完成后再继续?