2

想象一个列出一些食谱的表格视图。每次用户点击食谱时,都会加载一个新的表格视图,列出收据成分。

为了获取信息,我使用以下方法异步调用 REST API:

NSURLRequest *request = [NSURLRequest requestWithURL:url
                                      cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                      timeoutInterval:30];

当用户点击食谱时,会调用 API 以获取食谱成分。但是,一旦进入新视图(其中列出了成分)并且在收到答案之前,用户可以返回并选择新食谱。

在这种情况下,我会收到两个答案;每个请求一个。问题是我不知道这个答案的要求是什么,我会用错误答案中的错误内容刷新 UI。

我不确定在这种情况下哪种方法是正确的。我正在考虑在答案中包含每个请求参数。因此,例如,如果我使用 API 搜索某个术语,我们说“foo”,我也会在答案中包含该术语,例如:

要求:

http://domain.com/api/search?term=foo

回答

{
"requestType": "search",
"term": "foo",
"result" : "a foo result"
}

在每个答案中包含每个请求参数对我来说看起来很奇怪,但这是我发现的唯一解决方案,可以创建一个准备好被称为异步的无状态 API。

¿ 有没有其他方法可以做到这一点?

(我正在使用委托模式为收到答案时调用的每个请求分配一个对象。问题是,在食谱的示例中,每次列出食谱成分时都会重用成分表视图)。

4

2 回答 2

2

一种可能性是在请求中包含一个唯一的“请求 ID”,并让服务器回显它。那么服务器不需要返回所有的请求参数,只需要返回请求ID。客户端将为每个请求生成一个新 ID,可能使用像递增整数这样简单的方法。

另一种可能性是创建一个“可取消的异步请求”。当您发出请求时,返回一个可用于取消请求的对象。如果在委托被解雇之前请求被取消,那么确保委托不会被解雇。当一个已取消请求的响应返回时,只需将其丢弃即可。对于您的成分表,在您发出新请求之前,您取消任何待处理的请求(这样您一次最多有一个未取消的请求)。

实现这一点的一种方法是构建一个两阶段回调。由基础设施管理的第一个回调只是检查请求是否被取消。如果没有,它会继续调用第二个回调(实际上是您的委托)。

于 2010-01-23T17:58:00.140 回答
0

这里的一种典型方法是为每个配方分配一个唯一值(“键”值)并将其发送回响应,就像您建议的那样。如果键值是唯一且简短的,则键值可以是配方名称,但更常见的策略是仅使用唯一编号或其他对用户无意义的值,但随着时间的推移用于唯一标识配方,即使(对于例如)名称更改。在数据库术语中,这是业务键和代理键之间的区别。两者都是唯一标识符,但业务键对用户有意义(例如名称),而代理键则没有。我的建议是使用代理键,因为您可以缩短它并且永远不需要更改,因为用户不关心它。

请注意,如果您在任何 Web 服务调用中接受作为参数返回的密钥,则必须对其进行验证(或在考虑安全性时对其进行加密),因为您永远不知道客户端是否会篡改它。

顺便说一句,我在这里假设客户端“知道”最近选择了哪个食谱,因此它可以忽略其他食谱的响应。

于 2010-01-23T17:59:07.413 回答