这是不好的设计/违反模型 - 视图 - 控制器?

时间:2012-07-19 00:58:27

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

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

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

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

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

对于我的视图绘制功能本身而言,设计下载图像的逻辑是不是很糟糕?感觉有点像违反MVC,因为我的观点正在努力获取它应该显示的数据。但是,实际的网络正在其他地方(在图像缓存类中)进行,并被抽象掉,以便视图只是调用[ImageCache getImageForIdentifier:... completionHandler:...]

2 个答案:

答案 0 :(得分:1)

您的ImageCache类是Model级别类的示例。它不了解任何UI。好的MVC会说View类就像你的网格视图一样永远不会直接与Model类对话。这就是控制器的用途。

更简洁的实现方法是让控制器使用ImageCache进行下载并更新网格视图。这会将一些业务逻辑从网格视图类中移出,并使其仅担心呈现。

答案 1 :(得分:1)

嗯,视图类不应该进行任何网络调用。视图只能与Controller通信以获取需要显示的数据。所以,

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

  5. 我的目标是创建三个不同的类,

    1. ImageCahce =模型类
    2. ImageCollection =模型类
    3. ImageDataController =控制器类。
    4. ImageCache类存储已下载的图像,可能在CoreData中。每次从ImageCache以及稍后需要从ImageDataController获取更多新图像时,ImageCollection类将被填充。