模型上的操作属于应用程序设计模式的哪些部分?

时间:2016-09-15 23:46:27

标签: ios asynchronous design-patterns architecture network-programming

假设我们想要制作一个包含以下内容的application

    选定operations 上的
  • 异步耗时 objects
  • 对于某个object,我们希望访问相关status的{​​{1}}。
  • operation能够showcancelpause这些操作。

然后我的问题如下:

这些multiple views及其operations在哪里属于应用程序设计模式?

在这里将它放入上下文是一个虚拟应用程序:

示例应用程序:

我们有一个应用程序,您可以将progress/status应用于Filters。应用程序包含ImagesDirectory View

  • 每个Detail View都可以filter应用于每个asynchronously的{​​{1}}个image
  • 来自view的{​​{1}} - 操作可以是filterobserved
  • 如果已为canceledviews启动过滤操作,或者此类filter-type已生成image,则无法启动过滤操作。< / LI>
  • 在这个虚拟应用程序中,视图是后续的,但在一般情况下,您将无法直接在视图之间传递信息。

Directory View

enter image description here

进度

filterresult等设计模式中将Service LayerNetwork ControllerViewModel解耦非常简单,只要您在有效MVC时没有提供MVVM而不是UX feedback

但是当我正在申请确认上述标准时,我总是最终

  • spinner
  • 期间不允许network request更改user
  • view对当前正在处理的对象的operation进行操作,并将其传递给Tagging,或直接从id <views查看/ LI>
  • Network Controller创建单独的views/view controllers,突然我的entities
  • 中有operations

很明显有(非常臭的)方法可以解决这个问题,但是他们都感觉很脏,并没有与模式的内容联系起来。

纯粹来自软件架构设计模式的观点,您将如何接近这一点?

2 个答案:

答案 0 :(得分:2)

我通常更喜欢这个设计问题的promise对象。 promise对象可以包含取消操作的方法,检查操作的状态,甚至包含要执行的闭包,具体取决于操作的结果(成功,失败,取消等)。

该承诺对象可以从视图传递到视图,也可以在多个请求时从网络层提供服务(视图A启动操作,视图B稍后尝试启动它但它已经在运行,因此获得相同的承诺对象)。

  

这意味着在这种情况下服务层或网络层需要呈现哪些操作,请求正在进行哪个对象,对吧?因为您不想仅仅获取promise对象,所以如果操作已经启动,则应该隐藏按钮。我想你会将这些承诺对象保留在你的app模型之外,因为它们不会在会话之间存在,并且网络层会通过url存储它们,但是你通常如何从网络层反馈它而不暴露于网络层到了ui?

网络层具有方便的方法,UI可用于启动用户发起的请求。网络层确定请求是否已经启动并返回相同的承诺。即使网络层在内部启动进程(自动刷新等),如果UI尝试启动相同的进程,它仍然可以将承诺传递回UI。

只要操作正在进行,promise对象才会生效。实际上我的操作是promise对象的真正持有者,网络控制器拥有操作队列。然后当请求进入时,我在队列中搜索该操作的存在,如果存在,则返回操作的promise。如果它不存在,我创建一个新操作,将其放入队列并返回其promise对象。

UI和后端之间的接口是网络控制器上公开的方法。用户界面不知道操作,它只是有一个功能,说“去刷新这个或去那个”并获得一个承诺。它不需要知道或关心如何执行作业,它只知道承诺是检查该操作状态的方法。

现在,如果是数据刷新,那么数据更新不需要承诺,NSFetchedResultsController将处理。在这种情况下的承诺只处理“我是活跃的”和“取消我”类型请求。

答案 1 :(得分:0)

有很多方法可以做到这一点。但这是一个想法...也许你可以使用messaging作为样式:定义一个“状态”通道,可能使用pub-sub模型来获取正在进行的操作的状态/进度。这样,执行操作的进程就会在通道上发布状态,并且您的多个视图会订阅该通道并显示状态。现在,如果您必须取消/暂停操作,则可能需要另一个控制通道。您必须管理并发,订单等。