Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 异步无状态API_Iphone_Objective C_Api_Rest_Stateless - Fatal编程技术网

Iphone 异步无状态API

Iphone 异步无状态API,iphone,objective-c,api,rest,stateless,Iphone,Objective C,Api,Rest,Stateless,想象一个列有一些食谱的表视图。每次用户点击配方时,都会加载一个新的表视图,其中列出receipe配料 为了获取信息,我正在使用以下异步调用REST API: NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData

想象一个列有一些食谱的表视图。每次用户点击配方时,都会加载一个新的表视图,其中列出receipe配料

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

NSURLRequest *request = [NSURLRequest requestWithURL:url
                                      cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                      timeoutInterval:30];
当用户点击配方时,会调用API以获取配方成分。然而,一旦进入新视图(列出配料)并且在收到答案之前,用户可以返回并选择新配方

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

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

请求:

回答

{
"requestType": "search",
"term": "foo",
"result" : "a foo result"
}
在我看来,在每个答案中包含每个请求参数是很奇怪的,但这是我发现的唯一一个创建无状态API的解决方案,它可以被称为异步API

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


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

一种可能性是在请求中包含一个唯一的“请求ID”,并由服务器响应它。然后,服务器不需要返回所有请求参数,只需要返回请求ID。客户端将为每个请求生成一个新ID,可能使用简单的方法,例如递增一个整数

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


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

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

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

顺便说一下,我在这里假设客户“知道”最近选择了哪个配方,所以它可以忽略其他配方的响应