【问题标题】:Is this bad design / a violation of model-view-controller?这是糟糕的设计/违反模型视图控制器吗?
【发布时间】:2012-07-19 00:58:26
【问题描述】:

我正在编写一个连接到服务器并获取图像列表的应用程序,然后下载它们并在网格中显示它们。

此过程的第一部分由我拥有的客户端类完成,该类连接到服务器并询问图像 URL 列表。我在视图控制器中执行此操作并将其传递给我的视图。

第二部分由我编写的图像缓存类完成,它获取每个图像 URL 并检查应用程序是否已下载并存储它。如果是这样,它会从文件系统中获取图像并返回它。否则它会异步下载图像并存储它。

我现在做事的方式是,我的视图控制器获取图像标识符列表并将它们传递到我的视图中。然后视图为每个图像创建图像视图并用占位符图像填充它们,然后为每个图像询问图像缓存并在下载图像时填充图像。

我的视图的绘制功能本身具有这种下载图像的逻辑是否是糟糕的设计?感觉有点像违反 MVC,因为我的视图正在努力获取它应该显示的数据。然而,实际的网络正在其他地方(在图像缓存类中)完成并被抽象出来,因此视图只是调用[ImageCache getImageForIdentifier:... completionHandler:...]

【问题讨论】:

    标签: objective-c model-view-controller design-patterns


    【解决方案1】:

    好吧,视图类不应该进行任何网络调用。视图可以只与控制器通信以获取需要显示的数据。所以,

    1. 您的控制器工作是获取 URL 或图像。
    2. 有一个模型类,其中包含需要稍后显示的所有图像的集合。将此模型类引用添加到您的控制器中。
    3. 控制器应该检查缓存并填充您的模型类。如果缓存中没有图像,那么您的控制器应该为您的模型下载这些图像。
    4. 从控制器公开一个公共方法以从模型对象填充您的视图。

    我会创建三个不同的类,

    1. ImageCahce = 模型类
    2. ImageCollection = 模型类
    3. ImageDataController = 控制器类。

    ImageCache 类存储已经下载的图片,可能在 CoreData。 ImageCollection 类每次都会从 ImageCache 中填充,之后需要更多的新图像,然后从 ImageDataController 中填充。

    【讨论】:

    • 我想问题是我对我的图像缓存是模型还是控制器感到困惑。我认为您的方法更适合我的需求;将图像缓存视为控制器并创建一个模型类以放置在我的视图和我的控制器之间。谢谢!
    • ImageCache 是一个模型类,ImageDataController 可能是你的潜在控制器。
    • 我明白了,这更有意义。
    • 我最终按照你的建议做了。我创建了一个模型类来表示图像及其标识符和一些其他信息,并为图像集合创建了另一个类,以及使用缓存填充集合的控制器。它最终比以前的实现要干净得多。非常感谢。
    【解决方案2】:

    您的ImageCache 类是模型级别类的示例。它不了解任何 UI。好的 MVC 会说 View 类,如您的网格视图,不应该直接与 Model 类对话。这就是控制器的用途。

    更简洁的实现方式是让控制器使用 ImageCache 进行下载并随时更新网格视图。这将一些业务逻辑从网格视图类中移出,让它只关心表示。

    【讨论】:

      猜你喜欢
      • 2011-08-12
      • 2012-09-06
      • 2011-08-01
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      相关资源
      最近更新 更多