2014-11-06 55 views
0

我开发了一个请求令牌来执行所有HTTPRequest的应用程序。 我管一类中的所有100个不同的请求被称为NVEngine在那里我打电话给他们,如:处理会话过期的iOS HTTPRequest

- (void) sendRequest:(NSURLRequest *)theRequest withRequestType:(NVRequestType)requestType {  
    NVURLConnection *conn = [[NVURLConnection alloc] initWithRequest:theRequest 
                 delegate:self 
                requestType:requestType]; 

    if (!conn) {  
    NVLog(@"+++++++++++++++++++++++ UNABLE TO CREATE CONNECTION");  
    } 
} 

的问题是,这个请求的结果可能是“会话过期”,在这种情况下我必须做一个重新认证的http请求来刷新令牌,然后在没有用户交互的情况下重新调用相同的先前请求。我如何在我的sendRequest方法上管理回调?来自- (void) parseResultForConnection:(NVURLConnection *)connection之一?如果我可以返回sendRequest,我可以首先执行同步请求来检索新令牌,然后重试我以前的HTTPCall。

PS:我已经看到这个主题的一些答案,如Session expire design pattern 但我没有找到什么是我正在寻找。

+0

你是否尝试实现'NSURLConnectionDelegate'和/或'NSURLConnectionDataDelegate'? – Daniel 2014-11-06 09:34:46

+0

parseResultForConnection已经是委托的实现了,我不明白你的问题。你可以说得更详细点吗? :) – fustalol 2014-11-06 09:45:49

+0

好的,你正在使用一个甚至没有谷歌意识到的自定义类。所以没有人能够帮助你如何使用它。但是,通常情况下,您只需在'connectionDidFinishLoading:'解析接收到的数据,并且如果您收到'session expired',您只需发送一个新请求以获取新令牌并重试之前的连接。当使用'NSURLConnection'即 – Daniel 2014-11-06 09:54:18

回答

1

你可以做这样的:

  1. 你发送请求,我假设是异步的。
  2. 其中一个请求收到session expired
  3. 您可以设置一个静态变量,例如static BOOL isRetrievingNewTokenYES。在收到新令牌后,您可以创建一个带有块的静态队列,然后使用收到session expired的请求调用对其进行初始化。如果在isRetrievingNewToken==YES时收到新请求,则将其放入队列中。如果另一个请求收到session expired,则将其放入队列中。
  4. 当您收到新标记时,将执行队列上的所有块,删除这些项并将isRetrievingNewToken设置为NO

根据它的外观,在连接类NVURLConnection中实现此行为可能是一个好主意。

+0

问题是,如果我使用'NSURLConnection initWithRequest:delegate:'执行请求,如何检索原始请求,然后在令牌请求之后重试它? – fustalol 2014-11-06 10:49:55

+0

如果使用'NSURLConnection',则可以通过调用'connection.currentRequest'来检索原始请求,其中'connection'是'NSURLConnection *'对象(在大多数委托方法中发送) – Daniel 2014-11-06 12:05:21