2010-01-23 49 views
2

想象一下列出一些食谱的表格视图。用户每次点击食谱时,都会加载一个新的表格视图,列出食谱成分。异步无状态API

来获取信息,我打电话异步使用REST API:

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

当用户点击一个偏方,对API调用,以获得配方成分。但是,一旦在新视图(哪些列表成分)中以及在接收到答案之前,用户可以返回并选择新配方。

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

我不确定在这种情况下哪种方法是正确的。我正考虑在答案中包含每个请求参数。所以,如果我是,例如,使用API​​来搜索特定术语,我们说“富”,我会包括在回答期限过,例如:

请求:

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

回答

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

它看起来很奇怪,我包括在每个答案的每个请求参数,但它是我发现CREA唯一的解决办法一个无状态API准备被称为异步。

¿是否有任何其他方式来完成此?

(我使用委托模式为接收到答案时调用的每个请求分配一个对象。问题是,在配方示例中,成分表视图被重用eache time recipe ingredientes are listed )。

回答

2

一种可能性是在请求中包含一个唯一的“请求ID”,并让服务器回应它。然后服务器不需要返回所有的请求参数,只需要返回请求标识。客户端会为每个请求生成一个新的ID,可能使用像递增整数一样简单的操作。

另一种可能性是创建一个“可取消的异步请求”。发出请求时,返回可用于取消请求的对象。如果请求在委托被解雇之前被取消,那么确保委托不会被解雇。当一个响应返回一个被取消的请求时,就把它扔掉。对于您的配料表,在发出新的请求之前,您可以取消任何未决的请求(以便一次最多只有一个未取消的请求)。

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

0

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

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

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