假设我们想要制作一个包含以下内容的application
:
operations
上的objects
object
,我们希望访问相关status
的{{1}}。operation
能够show
,cancel
和pause
这些操作。然后我的问题如下:
multiple views
及其operations
在哪里属于应用程序设计模式?在这里将它放入上下文是一个虚拟应用程序:
我们有一个应用程序,您可以将progress/status
应用于Filters
。应用程序包含Images
和Directory View
。
Detail View
都可以filter
应用于每个asynchronously
的{{1}}个image
。 view
的{{1}} - 操作可以是filter
和observed
。canceled
和views
启动过滤操作,或者此类filter-type
已生成image
,则无法启动过滤操作。< / LI>
在filter
或result
等设计模式中将Service Layer
或Network Controller
与View
和Model
解耦非常简单,只要您在有效MVC
时没有提供MVVM
而不是UX feedback
。
但是当我正在申请确认上述标准时,我总是最终
spinner
network request
更改user
view
对当前正在处理的对象的operation
进行操作,并将其传递给Tagging
,或直接从id
<views
查看/ LI>
Network Controller
创建单独的views/view controllers
,突然我的entities
operations
很明显有(非常臭的)方法可以解决这个问题,但是他们都感觉很脏,并没有与模式的内容联系起来。
纯粹来自软件架构和设计模式的观点,您将如何接近这一点?
答案 0 :(得分:2)
我通常更喜欢这个设计问题的promise对象。 promise对象可以包含取消操作的方法,检查操作的状态,甚至包含要执行的闭包,具体取决于操作的结果(成功,失败,取消等)。
该承诺对象可以从视图传递到视图,也可以在多个请求时从网络层提供服务(视图A启动操作,视图B稍后尝试启动它但它已经在运行,因此获得相同的承诺对象)。
这意味着在这种情况下服务层或网络层需要呈现哪些操作,请求正在进行哪个对象,对吧?因为您不想仅仅获取promise对象,所以如果操作已经启动,则应该隐藏按钮。我想你会将这些承诺对象保留在你的app模型之外,因为它们不会在会话之间存在,并且网络层会通过url存储它们,但是你通常如何从网络层反馈它而不暴露于网络层到了ui?
网络层具有方便的方法,UI可用于启动用户发起的请求。网络层确定请求是否已经启动并返回相同的承诺。即使网络层在内部启动进程(自动刷新等),如果UI尝试启动相同的进程,它仍然可以将承诺传递回UI。
只要操作正在进行,promise对象才会生效。实际上我的操作是promise对象的真正持有者,网络控制器拥有操作队列。然后当请求进入时,我在队列中搜索该操作的存在,如果存在,则返回操作的promise。如果它不存在,我创建一个新操作,将其放入队列并返回其promise对象。
UI和后端之间的接口是网络控制器上公开的方法。用户界面不知道操作,它只是有一个功能,说“去刷新这个或去那个”并获得一个承诺。它不需要知道或关心如何执行作业,它只知道承诺是检查该操作状态的方法。
现在,如果是数据刷新,那么数据更新不需要承诺,NSFetchedResultsController
将处理。在这种情况下的承诺只处理“我是活跃的”和“取消我”类型请求。
答案 1 :(得分:0)
有很多方法可以做到这一点。但这是一个想法...也许你可以使用messaging作为样式:定义一个“状态”通道,可能使用pub-sub模型来获取正在进行的操作的状态/进度。这样,执行操作的进程就会在通道上发布状态,并且您的多个视图会订阅该通道并显示状态。现在,如果您必须取消/暂停操作,则可能需要另一个控制通道。您必须管理并发,订单等。