Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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
Ios 使用异步调用自动重新登录_Ios_Objective C_Asynchronous_Network Programming - Fatal编程技术网

Ios 使用异步调用自动重新登录

Ios 使用异步调用自动重新登录,ios,objective-c,asynchronous,network-programming,Ios,Objective C,Asynchronous,Network Programming,我有两个对服务器的异步调用。调用对用户进行身份验证并返回会话令牌。调用B从服务器获取数据。呼叫B需要来自呼叫A的会话令牌,以便服务器接受请求并返回数据 10分钟后,会话令牌过期,服务器拒绝向呼叫B返回数据。在这种情况下,我们必须再次执行呼叫A以重新验证并获取可用于呼叫B的新有效会话令牌 我面临的问题是,我想将其自动化,而我不知道如何用干净的设计实现它。我希望通过这种方式实现它,如果call B从服务器接收到“会话已过期”,它将启动异步调用a,并使用call a提供的新会话令牌重新启动自身。Obj

我有两个对服务器的异步调用。调用对用户进行身份验证并返回会话令牌。调用B从服务器获取数据。呼叫B需要来自呼叫A的会话令牌,以便服务器接受请求并返回数据

10分钟后,会话令牌过期,服务器拒绝向呼叫B返回数据。在这种情况下,我们必须再次执行呼叫A以重新验证并获取可用于呼叫B的新有效会话令牌


我面临的问题是,我想将其自动化,而我不知道如何用干净的设计实现它。我希望通过这种方式实现它,如果call B从服务器接收到“会话已过期”,它将启动异步调用a,并使用call a提供的新会话令牌重新启动自身。Objective-C和iOS框架提供的工具是否可以实现这种功能?

如果您使用的是,您将创建一个子类AFHttpClient,它知道如何执行这两个操作。在callB的实现中,检查是否从服务器获得无效的会话响应,并手动调用a,然后在其完成委托中再次调用b


对于手动重新验证后调用
callB
,您可能需要捕获
callB
的参数-如果只是几段数据,则局部变量可以正常工作。如果这变得不方便,您可能会对运行时和初始的
callB
感到棘手,并在以后再次执行它;基本上,您的
callB
方法将被swizzle/代理以检查会话是否有效。

没有任何文档记录。您可能需要状态标志(例如BOOL expired)来检测是否需要重新验证。我可能会使用一条带有标志测试的递归消息。我建议阅读,尤其是“Cookie存储”一章和所有关于身份验证的章节。操作过程取决于您是否正在为底层网络请求使用
NSURLSession
nsurconnection
NSURLDownload
对象,还取决于会话令牌的处理方式。如果将其作为Cookie处理,可能不需要在现有代码中添加太多内容。包括会话过期时的检测代码。我知道,如果callB检测到一个会话已过期,我可以简单地调用包含callA的方法。但我的问题是,在会话令牌(包括methodB被调用的所有参数)返回后,如何调用“重新运行”完整的callB?你写了一些关于“完成委托”的东西。你能详细解释一下你的意思吗?我想这是我的误解。更新了答案,包括捕捉信息的细节。谢谢RyanR。我不知道NSInvocation,但这个解决方案似乎很有前途。据我所知,我将能够将方法调用保存到一个NSInvocation对象中,并将其传递给callA,以使用所有参数运行B。callA可以在成功的重新身份验证后调用NSInvocation,这样callB就会像什么都没发生一样重新运行?明白了。NSInvocation功能非常强大,应该是一个简洁的解决方案。我已经实现了这个功能,效果非常好。再次感谢瑞安。不过有一个陷阱。我很难用方法参数创建nsinvocation。特别是要正确地保留它们。因此,对于所有与此抗争的人,我最终使用了一个helper方法
invocationWithTarget:selector:retainArguments:
为我创建nsinvocation。我找到了这块宝石