Ios 异步请求/响应:我什么时候真正完成了?

Ios 异步请求/响应:我什么时候真正完成了?,ios,cocoa-touch,cocoa,cocoa-design-patterns,Ios,Cocoa Touch,Cocoa,Cocoa Design Patterns,这是一个设计模式问题 设想一个编程任务,其中一个正在开发的客户端将与服务器异步交互(通过流)。假设挑战是执行数量不确定的任务,每个任务可能产生数量不确定的子任务(即爬树)。每个任务向服务器发出异步请求,并提供两个块(一个用于处理预期返回条件,一个用于处理错误条件)来处理响应处理 在这样的场景中,我很容易看到如何将出站请求排队,但清空该队列并不意味着整体任务已完成,因为后续响应处理可能会将更多出站请求排队。在完成整体任务的过程中,出站请求队列可能多次达到零 在iOS下,您可以建议什么样的选项(设计

这是一个设计模式问题

设想一个编程任务,其中一个正在开发的客户端将与服务器异步交互(通过流)。假设挑战是执行数量不确定的任务,每个任务可能产生数量不确定的子任务(即爬树)。每个任务向服务器发出异步请求,并提供两个块(一个用于处理预期返回条件,一个用于处理错误条件)来处理响应处理

在这样的场景中,我很容易看到如何将出站请求排队,但清空该队列并不意味着整体任务已完成,因为后续响应处理可能会将更多出站请求排队。在完成整体任务的过程中,出站请求队列可能多次达到零

在iOS下,您可以建议什么样的选项(设计模式和有用的类)来确定整体任务何时真正完成

另一个问题是,在错误场景中(对于任何子任务),我希望取消整体任务(以及所有子任务)


提前谢谢

对不起,可能是我不懂你的意思,试试http请求,可能对你有帮助

对不起,可能是我不懂你的意思,试试http请求,可能对你有帮助

出站请求排队与服务器和客户端之间的通信有关,与完成无关

每当需要执行任务时,都会发送任务请求并将其添加到当前挂起的任务集合中

当您收到答案时,您将对其进行处理,最终生成新任务,然后从挂起的任务集合中删除与答案相关的任务

当没有挂起的任务时,您就完成了

在出现错误时中止需要服务器的明确支持。您需要能够发送挂起任务的中止请求,并且服务器必须能够中止该任务并向您确认这一事实(或者忽略中止请求,如果服务器上的任务已经完成,并且服务器已经向您发送了该任务的答复)

处理错误响应时,您遍历挂起任务集合,为每个任务向服务器发送中止请求,并将它们标记为已取消(但将它们保留在挂起任务集合中)


当您收到标记为已取消的任务的答复时,您将忽略该答复(并从集合中删除该任务),无论该答复是成功答复、错误答复还是中止确认

出站请求排队与服务器和客户端之间的通信有关,与完成无关

每当需要执行任务时,都会发送任务请求并将其添加到当前挂起的任务集合中

当您收到答案时,您将对其进行处理,最终生成新任务,然后从挂起的任务集合中删除与答案相关的任务

当没有挂起的任务时,您就完成了

在出现错误时中止需要服务器的明确支持。您需要能够发送挂起任务的中止请求,并且服务器必须能够中止该任务并向您确认这一事实(或者忽略中止请求,如果服务器上的任务已经完成,并且服务器已经向您发送了该任务的答复)

处理错误响应时,您遍历挂起任务集合,为每个任务向服务器发送中止请求,并将它们标记为已取消(但将它们保留在挂起任务集合中)


当您收到标记为已取消的任务的答复时,您将忽略该答复(并从集合中删除该任务),无论该答复是成功答复、错误答复还是中止确认

谁知道任务何时完成;客户机还是服务器?客户机知道。服务器(本质上)是无状态的。谁知道任务何时完成;客户机还是服务器?客户机知道。服务器(本质上)是无状态的。谢谢,模拟。这可能是正确的方向。该集合现在已经存在,但我正在从中提取“活动”交互以进行处理。如果我将活动任务保留在集合中,直到它真正完成为止,那么正在进行的任务达到零的问题就会消失。我来做面条。再次感谢,谢谢你。这可能是正确的方向。该集合现在已经存在,但我正在从中提取“活动”交互以进行处理。如果我将活动任务保留在集合中,直到它真正完成为止,那么正在进行的任务达到零的问题就会消失。我来做面条。再次谢谢。弗兰克,谢谢你的提示。不幸的是,我的工作层比ASI低(直接使用NSStreams)。另外,您是否知道ASI不再被积极维护(至少这是我最后一次听到)。Frank,我在许多项目中使用过ASI。这段时间工作得很好,但是在你需要这种能力的时候,你可能需要考虑新的、基于块的库。弗兰克,谢谢你的提示。不幸的是,我的工作层比ASI低(直接使用NSStreams)。另外,您是否知道ASI不再被积极维护(至少这是我最后一次听到)。Frank,我在许多项目中使用过ASI。它的工作时间很好,但有更新的,基于块的库,你可能需要考虑当你需要这种能力。